SRM505 Div2Medium PerfectSequences
http://community.topcoder.com/stat?c=problem_statement&pm=11397
各項について、変更先の数字を、それ以外の数からなる和と積をととする。となる整数の存在を調べるのが基本。ただし以下の点に注意。
- 変更しないのはダメ。
- 配列のサイズが1なら必ず"Yes"
- のとき0除算なので別に考えると、であればよい。
最悪のケースだとになってオーバーフローするからこのコードはダメなはずなんだけど、普通にシステムテスト通ってズコー
あえて対処するなら和と積を計算するとき、になった瞬間その項を飛ばすぐらいか。
#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"; } };