URAL 1807 (二)

2014-11-23 19:15:19 · 作者: · 浏览: 20
int bor=sqrt((float)M),temp; forl(i,2,bor) { if(!nprime[i]) { prim.push_back(i); for(int j=i;(temp=j*i)<=M;j++) nprime[temp]=true; } } forlec(j,bor+1,M) { if(!nprime[j])prim.push_back(j); } pra(prim,0,prim.size()-1); } void solve(int n) { rst(dp,0); int gcd=0,div; for(int i=2;prim[i]*prim[i]<=n;i++) { if(n%prim[i]) continue; gcd=n/prim[i]; break; } div=n/gcd; forl(i,1,N) { int k=prim[i-1]; forlec(j,1,div) { dp[i][j]=dp[i-1][j]; pre[i][j]=j; } while(k<=div) { forlec(j,k,div) { if(dp[i][j]