SRM505 Div2Medium PerfectSequences

http://community.topcoder.com/stat?c=problem_statement&pm=11397

各項について、変更先の数字をx、それ以外の数からなる和と積をSTとする。S+x=Tx⇔S=(T-1)x⇔x=\frac {S}{T-1}となる整数x(\geq 0)の存在を調べるのが基本。ただし以下の点に注意。

  • 変更しないのはダメ。
  • 配列のサイズが1なら必ず"Yes"
  • T-1=0のとき0除算なので別に考えると、S=0であればよい。


最悪のケースだとT=10^{9\times 50}になってオーバーフローするからこのコードはダメなはずなんだけど、普通にシステムテスト通ってズコー
あえて対処するなら和と積を計算するとき、S\verb|<|T-1になった瞬間その項を飛ばすぐらいか。

#include <bits/stdc++.h>
using namespace std;

class PerfectSequences {
public:
   string fixIt( vector <int> seq ) {
       int n=seq.size();
       if(n==1) return "Yes";
       long long PRO[n];
       long long SUM=0;
       for(int i=0;i<n;i++){
           SUM+=seq[i];
           PRO[i]=1;
           for(int j=0;j<n;j++){
               if(j!=i) PRO[i]*=seq[j];
           }
       }
       for(int i=0;i<n;i++){
           long long sum=SUM-seq[i],pro=PRO[i]-1;
           if(pro==0){
               if(sum==0) return "Yes";
               else continue;
           }
           if(sum%pro==0&&sum/pro!=seq[i]&&sum/pro>=0) return "Yes";
       }
       return "No";
   }
};