數論專題(持續更新)
阿新 • • 發佈:2020-07-16
數論好難啊QAQ
----------------------------------------------------------------------------------
先來一些基本的數論必備程式碼
(1)尤拉篩
const int MAXN=3000001; int prime[MAXN];//儲存已經求出的素數 bool vis[MAXN];//判斷是不是素數 int Prime(int n) { int cnt=0; memset(vis,0,sizeof(vis)); //vis[]=0指是素數 for(int i=2;i<n;i++) { if(!vis[i]) prime[cnt++]=i; for(int j=0;j<cnt&&i*prime[j]<n;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0)//尤拉篩法的精髓之處,目的是為了不重複篩除資料 break; } } return cnt;//返回小於n的素數的個數 }
具體的之前部落格有寫:https://www.cnblogs.com/Knightero/p/12778655.html
(2)gcd與lcm
int gcd( int a,int b) { return b==0?a:gcd(b,a%b); }
int lcm(int a,int b) { return a/gcd(a,b)*b; }
(3)快速冪
int quick_pow(int x,int n,int mod){ int res = 1; while(n > 0){ if(n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } returnres; }
------------------------------------------------------------------------------------------
新學習到的知識
(1)求逆元
運用費馬小定理求逆元(其實不難)
(a/b)%mod不等於(a%mod/b%mod)%mod;
但是a/b可以看成a*b^-1
把除法轉換為乘法來運算
逆元就是研究怎麼已知b算出b^-1(且要有%mod,不然直接除就好了)
這時候出現了費馬小定理
所以要計算(a/b)%mod=(a*b^-1)%mod=(a*b^(p-2))%mod
而此刻我們會求b^(p-2),利用快速冪可求
long long int quick_pow(long long int a, long long int b) { long long int ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans; } long long int inv(long long int a, long long int b)//求(a/b)%mod { return a * quick_pow(b, mod - 2) % mod; }