標籤:style blog color os io for div sp log
唯一分解定理
把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 }
UVA 10791 Minimum Sum LCM