タイトルから問題文考えてそう。
https://yukicoder.me/problems/no/2207
問題
巨大な正整数Nが、素因数分解した形で与えられる。
素数pと非負整数rで、Binom(p,r)=Nとなるものはあるか。
解法
pはNの素因数の最大値となる。
この時、p未満のrを取れば、Binom(p,r)は最大の素因数の倍数となる。
あとは、rを1から順にインクリメントさせながら、Binom(p,r)を更新していこう。
Binom(p,r)は素因数分解した形で持っておき、(B-r)を掛けたりrで割ったりする作業を行っていく。
int N; int P[11202020],E[11202020],C[11202020]; int V[11202020]; void solve() { int i,j,k,l,r,x,y; string s; for(i=2;i<=10000000;i++) if(V[i]==0) { for(j=i;j<=10000000;j+=i) V[j]=i; } cin>>N; FOR(i,N) { cin>>P[i]>>E[i]; C[P[i]]=E[i]; } int D=N; for(int r=1;r<=P[N-1]/2;r++) { x=r; while(x>1) { if(C[V[x]]==0) D++; C[V[x]]++; if(C[V[x]]==0) D--; x/=V[x]; } x=P[N-1]+1-r; while(x>1) { if(C[V[x]]==0) D++; C[V[x]]--; if(C[V[x]]==0) D--; x/=V[x]; } if(D==0) { cout<<P[N-1]<<" "<<r<<endl; return; } } cout<<"-1 -1"<<endl; }
まとめ
e[K-1]が2以上でもこれでいいのか…?