标签:
kb2.7.1分解质因数求欧拉函数
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; //素数筛选和合数分解 const int MAXN=10000; int prime[MAXN+1]; void getPrime(){ memset(prime,0,sizeof(prime)); for(int i=2;i<=MAXN;i++){ if(!prime[i])prime[++prime[0]]=i; for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++){ prime[prime[j]*i]=1; if(i%prime[j]==0)break; } } } long long factor[100][2]; int fatCnt; int getFactors(long long x){ fatCnt=0; long long tmp=x; for(int i=1;prime[i]<=tmp/prime[i];i++){ factor[fatCnt][1]=0; if(tmp%prime[i]==0){ factor[fatCnt][0]=prime[i]; while(tmp%prime[i]==0){ factor[fatCnt][1]++; tmp/=prime[i]; } fatCnt++; } } if(tmp!=1){ factor[fatCnt][0]=tmp; factor[fatCnt][1]=1; fatCnt++; } return fatCnt; } int main(){ getPrime(); getFactors(8);//8=2*2*2; for(int i=0;i<fatCnt;i++) for(int j=0;j<factor[i][1];j++) printf("%d ",factor[i][0]); printf("\n"); int ret=8;//互质的数有1,3,5,7 for(int i=0;i<fatCnt;i++) ret=ret/factor[i][0]*(factor[i][0]-1); printf("%d\n",ret); return 0; }
kb2.7.2筛法欧拉函数
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int euler[3000001]; void getEuler(){ memset(euler,0,sizeof(euler)); euler[1]=1; for(int i=2;i<=3000000;i++) if(!euler[i]) for(int j=i;j<=3000000;j+=i){ if(!euler[j]) euler[j]=j; euler[j]=euler[j]/i*(i-1); } } int main(){ getEuler(); printf("%d\n",euler[8]);//互质的数有1,3,5,7 return 0; }
kb2.7.3求单个数的欧拉函数
#include<iostream> #include<stdio.h> using namespace std; long long euler(long long n){ long long ans=n; for(int i=2;i*i<=n;i++){ if(n%i==0){ ans-=ans/i; while(n%i==0) n/=i; } } if(n>1)ans-=ans/n; return ans; } int main(){ int e=euler(8);//互质的数有1,3,5,7 printf("%d\n",e); return 0; }
kb2.7.4线性筛(同时得到欧拉函数和素数表)
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int MAXN=10000000; bool check[MAXN+10]; int phi[MAXN+10]; int prime[MAXN+10]; int tot;//素数的个数 void phi_and_prime_table(int N){ memset(check,false,sizeof(check)); phi[1]=1; tot=0; for(int i=2;i<=N;i++){ if(!check[i]){ prime[tot++]=i; phi[i]=i-1; } for(int j=0;j<tot;j++){ if(i*prime[j]>N)break; check[i*prime[j]]=true; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } else{ phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } } int main(){ phi_and_prime_table(100); for(int i=0;i<tot;i++) printf("%d ",prime[i]); printf("\n"); printf("%d\n",phi[8]);//互质的数有1,3,5,7 return 0; }
标签:
原文地址:http://www.cnblogs.com/bofengyu/p/4741744.html