1. 程式人生 > 實用技巧 >Bi-shoe and Phi-shoe LightOJ - 1370(數論+素數篩)

Bi-shoe and Phi-shoe LightOJ - 1370(數論+素數篩)

題目連結:https://vjudge.net/problem/LightOJ-1370

題意:給你N個尤拉函式值,找出每一個大於等於該尤拉函式值的數,並且要求相加和最小。

題解:因為素數i的尤拉函式值等於i-1,所以我們只要找出大於等於i+1的素數即可。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<cstring>
 5 #include<cstdio>
 6 using namespace std;
 7 #define mem(s,n) memset(s,n,sizeof s);
 8
typedef long long ll; 9 const int maxn=1e6+100; 10 const int Inf=0x7f7f7f7f; 11 int prim[maxn]; 12 //這裡只需要判斷是不是素數即可不用記錄。 13 void prime() 14 { 15 mem(prim,0); 16 prim[0]=prim[1]=1; 17 for(int i=2;i<maxn;i++) 18 { 19 if(prim[i]==0) 20 { 21 for(int j=i*2;j<maxn;j+=i)
22 { 23 prim[j]=1; 24 } 25 } 26 } 27 } 28 int main() 29 { 30 int t,n; 31 prime(); 32 //for(int i=0;i<maxn;i++) cout<<i<<" "<<prim[i]<<endl; 33 scanf("%d",&t); 34 int k=0; 35 while(t--) 36 {
37 scanf("%d",&n); 38 ll sum=0; 39 for(int i=1;i<=n;i++) 40 { 41 int p; 42 scanf("%d",&p); 43 p++; 44 while(prim[p]!=0) //找第一個大於等於p++的素數; 45 { 46 p++; 47 //cout<<p<<" "<< prim[p]<<endl; 48 } 49 sum+=p; 50 } 51 printf("Case %d: %lld Xukha\n",++k,sum); 52 } 53 return 0; 54 }
程式碼詳情