1. 程式人生 > >【數論】Minimum Sum LCM, UVa10791【唯一分解定理】【素數篩法】

【數論】Minimum Sum LCM, UVa10791【唯一分解定理】【素數篩法】

唯一分解定理+素數篩法

#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;
}