日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数论入门 2021-2-28

發布時間:2023/12/31 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数论入门 2021-2-28 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、

模運算

當答案或者運算過程中數據太大,題目要求輸出答案對某個大數據取模,
有以下結論:

(a+b)%MOD=(a%MOD+b%MOD)%MOD (a-b)%MOD=(a%MOD-b%MOD)%MOD (a*b)%MOD=(a%MOD*b%MOD)%MOD 而除法取模需要逆元,后面會介紹

c++語言取模過程中,會遵循商盡量大的原則,所以(-5)%3=-2
這個不符合數學上取模的標準,因此使用c++對減法取模應該寫成:

(a-b+MOD)%MOD

二、質數

1~n當中,大約有nln(n)\frac{n}{ln(n)}ln(n)n?個質數

1、質數篩

埃氏篩
復雜度為O(nlg(lg(n)))

const int maxn=1e6; int prime[maxn]; bool vis[maxn]; int cnt=0; void Prime(int n){for(int i=2;i<=n;i++){if(!vis[i]){prime[++cnt]=i;for(int j=i*i;j<=n;j+=i){vis[j]=true;}}} }

//此處有個小優化,嵌套的循環內jjji?ii * ii?i 開始,而不是i+ii + ii+i開始,因為i?(2?>i?1)i*(2 ->i-1)i?(2?>i?1)在這之前都已經被篩去。

歐拉篩
復雜度O(n)

const int maxn=1e6; int prime[maxn]; bool vis[maxn]; int cnt=0; void Prime(int n){for(int i=2;i<=n;i++){if(!vis[i]){prime[++cnt]=i;}for(int j=1;prime[j]*i<=n;j++){vis[prime[j]*i]=true;if(i%prime[j]==0){//保證每個合數都用該數最小的質因子篩掉//當i%prime[j]==0的時候,說明如果j繼續加一,被篩掉的數就不是用其最小的質因子篩去的了。break;}}} }

2、質因數分解----試除法

任意正整數nnn最多有一個比sqrt(n)sqrt(n)sqrt(n)大的質因子,質因數分解模版如下:
(?????????)
質因數分解模版

int pdivid[10000]; int cnt=0;//記錄一共有多少個質因子 void divid(int n){for(int i=2;i<=n/i;i++){if(n%i==0){//此處i一定為質數pdivid[++cnt]=i;int s=0;while(n%i==0){n/=i;s++;//可以計算每個質因子出現的次數,這份代碼不記錄這個數}}}if(n>1){pdivid[++cnt]=n;} } int main(){int n;cin>>n;divid(n);cout<<pdivid[cnt]<<endl; }

三、約數

1、試除法

直接枚舉從1~sqrt(n)所有的數字,可以得到n所有的約數。
每個數的約數個數期望為lg(n).

2、約數個數和約數之和

先對N進行質因數分解,假設分解后:
o(`ω′ )o:::::

N==p1c1?p2c2?...?pkckN== p_1^{c_1} * p_2^{c_2} * ... *p_k^{c_k}N==p1c1???p2c2???...?pkck??

(pi為質因子,ci為質因子對應的次數)

那么N的約數個數為::
(c1+1)?(c2+1)?...?(ck+1)(c1 + 1) * (c2 + 1) * ... * (ck + 1)(c1+1)?(c2+1)?...?(ck+1)

N的約數之和為::
(p10+p11+...+p1c1)?...?(pk0+pk1+...+pkck)(p_1^0 + p_1^1 + ... + p_1^{c_1}) * ... * (pk^0 + pk^1 + ... + pk^{c_k})(p10?+p11?+...+p1c1??)?...?(pk0+pk1+...+pkck?)
(把上式子展開后,直接看出為計算每個約數的和)

const int mod=1e9+7; int main(){int n;cin>>n;unordered_map<int,int> primcnt;while(n--){int x;cin>>x;for(int i=2;i<=x/i;i++){while(x%i==0){x/=i;primcnt[i]++;}}if(x!=1){primcnt[x]++;}}ll ans=1;//遍歷mapfor(auto prim:primcnt){ans=(ans*(prim.second+1))%mod;}cout<<ans<<endl; }

3、最大公約數(gcd)

歐幾里得算法

gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a

(好神奇啊!)? ????

int gcd(int a,int b){if(b==0){return a;}elsereturn gcd(b,a%b); }

四、歐拉函數

1、定義
歐拉函數是小于n的正整數中與n互質的數的數目(比如φ(1)=1φ(1)=1φ(1)=1

2、公式
φ(N)=N?(1?1p1)?.....?(1?1pi)φ(N)=N*(1-\frac{1}{p_1}) * ..... * (1-\frac{1}{p_i})φ(N)=N?(1?p1?1?)?.....?(1?pi?1?)
其中pip_ipi?NNN的質因子。

3、篩法求1~n的歐拉函數

void get_eulers(int n){//得到1~n所有歐拉函數的值//其實是歐拉篩變體int cnt=0;phi[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){prim[++cnt]=i;//如果這個數是個素數,顯然在1~i之間,有i-1個數與其互質phi[i]=i-1;}for(int j=1;prim[j]*i<=n&&j<=cnt;j++){vis[i*prim[j]]=1;if(i%prim[j]==0){//如果prim[j]是i的因子//根據公式,phi[i]=i*(1-1/P1)*...*(1-1/Pi)//i*prim[j]的所有因子跟i相同//phi[i*prim[i]]=prim[i]*i*(1-1/P1)*...*(1-1/Pi)=phi[i]*prim[i]phi[i*prim[j]]=phi[i]*prim[j];break;}//如果prim[j]不是i的因子//那么i*prim[j]的因子與i相差一個prim[j]//phi[i*prim[i]]=phi[i]*prim[j]*(1-1/prim[j])=phi[i]*phi[prim[j]]phi[i*prim[j]]=phi[i]*(prim[j]-1);}} }

歐拉定理

如果a與n互質,那么aphi(n)≡1(modn)a^{phi(n)}≡1(mod n)aphi(n)1(modn).

四、快速冪

ll my_pow(int a,int k,int p=1e9+7){ll res=1;while(k){if(k&1){//如果k不能整除2res=(res*a)%p;}k>>=1;a=(a*a)%p;//讓底數平方}return res; }

總結

以上是生活随笔為你收集整理的数论入门 2021-2-28的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。