https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1732
大意:给出一个数字n,LCM(q1,q2,……,qk)=n,求解q1,a2……qk的最小和。
分析:刚开始读错题了(又读错T_T),是一系列的数字之和。
由算术基本定理,,同时,发现如果,是最小的,也就是说如果是由产生的,那么积是最小的,同时是一定的。比如,得到:
那么和最小等于2+2+3+5+5=17,但是题目的例子告诉我们,P集合中应该是没有相同的元素的,所以答案应该是4+3+25=32.
代码写得不好。。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long LL; const int N=1e7+10; LL pri[N],top; bool vis[N]; void getpri(){ for(int i=2;i<N;i++){ if(!vis[i]) pri[top++]=i; for(int j=0;j<top&&i*pri[j]<N;j++) { vis[i*pri[j]]=1; if(i%pri[j]==0) break; } } } LL fac[N],pow[N],cnt; LL bit[N]; LL power(LL a,LL p){ LL ans=1; while(p){ if(p&1) ans=ans*a; a=a*a; p>>=1; } return ans; } void solve(LL x){ cnt=0; memset(pow,0,sizeof(pow)); memset(bit,0,sizeof(bit)); for(int i=0;i<top&&pri[i]<=x;i++){ if(x%pri[i]==0){ fac[cnt]=pri[i]; while(x%pri[i]==0){ x/=pri[i]; pow[cnt]++; } bit[cnt]=power(fac[cnt],pow[cnt]); cnt++; } } if(x>1){ fac[cnt]=x; pow[cnt]=1; bit[cnt]=x; cnt++; } } LL find(){ LL ans=0; for(int i=0;i<cnt;i++){ ans+=bit[i]; } return ans; } int main() { LL n; getpri(); int ca=1; while(cin>>n&&n){ if(n==1) { printf("Case %d: 2\n",ca++); continue; } solve(n); if(cnt==1) { printf("Case %d: %lld\n",ca++,n+1); continue; } printf("Case %d: %lld\n",ca++,find()); } return 0; }