唯一分解定理

把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 }

 

posted on 2014-09-03 15:28  gfc  阅读(146)  评论(0编辑  收藏  举报