數論學習

歐拉函數篩法

歐拉函數:phi(i)為1到i之間與i互質的數的個數

 1 int prime[N],phi[N],isprime[N];
 2 void getpri()
 3 {
 4     int cnt=0;
 5     phi[1]=1;
 6     memset(isprime,0,sizeof(isprime));
 7     for(int i=2;i<N;++i)
 8     {
 9         if(!isprime[i])
10         {
11             prime[cnt++]=i;
12             isprime[i]=i;//質數條件isprime[i]==i
13             phi[i]=i-1;//質數的phi=i-1
14         }
15         for(int j=0;j<cnt&&i*prime[j]<N;++j)
16         {
17             isprime[i*prime[j]]=prime[j];
18             if(prime[j]>=isprime[i])//保證只有i的最小質因數的把i篩掉
19             {
20                 phi[i*prime[j]]=phi[i]*prime[j];//i與prime[j]不互質時
21                 break;
22             }
23             else
24                 phi[i*prime[j]]=phi[i]*(prime[j]-1);//i與prime[j]互質時
25         }
26     }
27 }

 

擴展歐幾里得

 1 ll exgcd(ll a,ll b,ll &x,ll &y)
 2 {
 3     if(b==0)
 4     {
 5         x=1;
 6         y=0;
 7         return a;
 8     }
 9     else
10     {
11         ll ret=exgcd(b,a%b,y,x);
12         y-=a/b*x;
13         return ret;
14     }
15 }

猜你喜欢

转载自www.cnblogs.com/Lin88/p/9902177.html