线性筛素数欧拉函数
線性篩素數:
(關鍵代碼為當i%prime[j]==0的時候跳出。)
#include <iostream> //線性篩素數。 #include <cstring> using namespace std; const int inf=1e6+7; int flag[inf]; //表示的是inf是不是質數,0表示不是,1表示是。 int prime[inf]; int k=0; void findprime(int n) {for(int i=2;i<=n;i++){if(!flag[i]) //說明i是素數??磥磉€是要使用素數的,因為歐拉篩是依照素數來進行篩后邊的數據的。 {prime[k++]=i; //添加上素數.} for(int j=0;j<k&&prime[j]*i<=n;j++){flag[ prime[j]*i ]=1; //標記和數。 if(i%prime[j]==0)break; } } } int main() {int n;scanf("%d",&n);memset(flag,0,sizeof(flag));findprime(n);for(int i=0;i<k;i++)printf("%d\n",prime[i]);return 0; }歐拉函數:
#include <iostream> //歐拉函數。 #include <cstring> using namespace std; const int inf=1e6+7; int phi[inf]; //phi[i]的含義是i 的歐拉函數值是多少?也就是說有幾個數字和i是互質的。 int flag[inf]; int prime[inf]; //記錄素數,標記素數。 int k=0; void euler(int n) {phi[1]=1; //特例。 for(int i=2;i<=n;i++){ if(!flag[i]) //說明i是質數。 {phi[i]=i-1; prime[k++]=i;} for(int j=0;j<k&&prime[j]*i<=n;j++){if(prime[j]*i>n)break;flag[prime[j]*i]=1; //標記和數。 if(i%prime[j]==0) //求質因數。 { phi[i*prime[j]]=phi[i]*prime[j];break; } elsephi[i*prime[j]]=phi[i]*phi[prime[j]]; }} }int main() {int n;scanf("%d",&n);memset(flag,0,sizeof(flag));euler(n); for(int i=1;i<=n;i++)printf("%d %d\n",i,phi[i]); return 0; }?
總結
- 上一篇: H. Fight Against Mon
- 下一篇: 烽火传递(dp+单调队列)