【數論】Minimum Sum LCM, UVa10791【唯一分解定理】【素數篩法】
阿新 • • 發佈:2019-01-05
唯一分解定理+素數篩法
#include<bits/stdc++.h> using namespace std; typedef long long LL; int cnt,n,prime[50010],tot,e[50010],kk;bool vis[50010];LL ans=0; void getprime(int m){ vis[0]=vis[1]=1; for(int i=2;i<=m;i++){ if(!vis[i])prime[++tot]=i; for(int j=1;j<=tot&&prime[j]<=m/i;j++){ vis[i*prime[j]]=true; if(i%prime[j]==0)break; } } } int main(){ ios::sync_with_stdio(false); getprime(50000); while(cin>>n){ if(!n)break; if(n==1)ans = 2; else{ memset(e,0,sizeof(e));ans=0;kk=0; for(int i=1;i<=tot;i++){ if(n%prime[i]==0)kk++; while(n%prime[i]==0){ e[i]++;n/=prime[i]; } if(n==1)break; } for(int i=1;i<=tot;i++){ if(e[i])ans+=pow(prime[i],e[i]); } if(kk<=1)ans++; if(n>1)ans+=n; } cout<<"Case "<<++cnt<<": "<<ans<<endl; } return 0; }