唯一分解定理
把n分解为 n=a1^p1*a2^p2*...的形式,易得每个ai^pi作为一个单独的整数最优。
坑:
n==1 ans=2;
n因子种数只有一个 ans++;
注意溢出。
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 typedef long long ll; 6 7 ll ans=0; 8 ll n; 9 ll sign[100000]; 10 ll pri[100000]; 11 int tot; 12 13 void getpri (){ 14 memset (sign,0,sizeof sign); 15 sign[0]=sign[1]=1; 16 for (int i=2;i*i<100000;i++) 17 if (!sign[i]) 18 for (int j=i*i;j<100000;j+=i) 19 sign[j]=1; 20 tot=0; 21 for (int i=2;i<100000;i++) 22 if (!sign[i]) 23 pri[tot++]=i; 24 } 25 26 ll solved (){ 27 if (n==1) 28 return 2; 29 ll ans=0; 30 int flag=0; 31 for (int i=0;i<tot&&pri[i]*pri[i]<=n;i++){ 32 ll temp=0; 33 if (n%pri[i]==0){ 34 temp=1; 35 flag++; 36 while (n%pri[i]==0){ 37 temp*=pri[i]; 38 n/=pri[i]; 39 } 40 } 41 ans+=temp; 42 } 43 if (n!=1){ 44 flag++; 45 ans+=n; 46 } 47 if (flag<=1) 48 ans+=1; 49 return ans; 50 } 51 52 int main (){//int a=46341;cout<<a*a<<" "<<(1<<31)<<endl; 53 int kase=0; 54 getpri (); 55 while (cin>>n&&n){ 56 ans=solved (); 57 cout<<"Case "<<++kase<<": "<<ans<<endl; 58 } 59 return 0; 60 }