uva 10791 Minimum Sum LCM(算術基本定理)
阿新 • • 發佈:2019-02-05
大意:給出一個數字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; }