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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数论 —— 约数

發(fā)布時(shí)間:2025/3/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数论 —— 约数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【唯一分解定理】

對(duì)于任意一個(gè)大于 1 的正整數(shù) n,都有且只有一種方式寫(xiě)出其素因子的乘積表達(dá)式。

即:,其中,?均為素?cái)?shù)

因此,當(dāng)給出一個(gè)數(shù) n 時(shí),可以暴力枚舉,以獲取 n 的素因子

map<int, int> num;//記錄素因子個(gè)數(shù) int factor[N],cntF;//記錄素因子 void getFactor(int n){cntF = 0;num.clear();for (int i = 2; i <= n / i;i++){if(n%i == 0)//記錄素因子factor[cntF++] = i;while(n%i == 0) {n /= i;num[i]++;//記錄素因子個(gè)數(shù)}}if(n > 1) {factor[cntF++] = n;num[n]++;} } int main(){int n;scanf("%d",&n);getFactor(n);for(int i=0;i<cntF;i++)cout<<factor[i]<<":"<<num[factor[i]]<<endl;return 0; }

【約數(shù)個(gè)數(shù)函數(shù)】

對(duì)于一個(gè)整數(shù) n,將其通過(guò)唯一分解定理分解,有:?

那么,n?的因子個(gè)數(shù)為:

顯然,d(n) 是一個(gè)積性函數(shù),那么可以用線性篩求出

由于每個(gè)數(shù)由其最小質(zhì)因子篩出,因此要開(kāi)一個(gè)輔助數(shù)組 num[i] 來(lái)表示 i 最小因子的次冪

那么,可分為以下三種情況討論

1)i 是質(zhì)數(shù)

當(dāng) i 為質(zhì)數(shù)時(shí),其約數(shù)僅有 1 與其自身,顯然存在:d[i]=2,num[i]=1

2)i%prime[j]!=0

當(dāng) i%prime[j]!=0 時(shí),i 沒(méi)有 prime[j] 這個(gè)質(zhì)因子,然而 i*prime[j] 中包含 prime[j]

根據(jù)前面得到的?d[i]=(a1+1)(a2+1)...(ak+1)

因此,要加上當(dāng)前的?prime[j],從而有:d[i*prime[j]]=(a1+1)(a2+1)...(ak+1)(1+1)

即:d[i*prime[j]]=d[i]*d[prime[j]]=d[i]*2

由于當(dāng)前的 prime[j] 必然是 i*prime[j] 的最小素因子,因此當(dāng)前最小素因子的個(gè)數(shù)為:num[i*prime[j]]=1

3)i%prime[j]=0

當(dāng) i%prime[j]=0 時(shí),i 中必然包含了至少一個(gè) prime[j],且?prime[j] 必定是 i 的最小質(zhì)因數(shù)

由于 i?prime[j] 與 i 相比,至少多了一個(gè)最小質(zhì)因子,根據(jù)前面得到的?d[i]=(a1+1)(a2+1)...(ak+1)

那么有:d[i?prime[j]]=(a1+1+1)(a2+1)...(ak+1)

即:d[i?prime[j]]=d[i]/(a1+1)?(a1+2)

當(dāng)前最小素因子的個(gè)數(shù)也在原來(lái)的 num[i] 的基礎(chǔ)多了一個(gè),即:num[i?prime[j]]=num[i]+1

int d[N],num[N]; int prime[N],cnt; bool bprime[N]; void getFactorNum(int n){d[1]=1;num[1]=1;for(int i=2;i<=n;i++){if(!bprime[i]){prime[++cnt]=i;d[i]=2;num[i]=1;}for(int j=1;j<=cnt&&i*prime[i]<=n;j++){bprime[i*prime[j]]=true;if(i%prime[j]!=0){d[i*prime[j]]=2*d[i];num[i*prime[j]]=1;}else{d[i*prime[j]]=d[i]/(num[i]+1)*(num[i]+2);num[i*prime[j]]=num[i]+1;break;}}} } int main(){int n;scanf("%d",&n);getFactorNum(n);for(int i=1;i<=n;i++)printf("%d\n",d[i]);return 0; }

【約數(shù)和函數(shù)】

對(duì)于一個(gè)整數(shù) n,將其通過(guò)唯一分解定理分解,有:?

其所有因子之和為:

顯然,σ(n) 是一個(gè)積性函數(shù),那么可以用線性篩求出

設(shè) sp[i] 表示?i 的最小質(zhì)因子的各次冪之和,即:

那么,可分為以下三種情況討論:

1)i?是質(zhì)數(shù)時(shí)

當(dāng) i?為質(zhì)數(shù)時(shí),其約數(shù)僅有 1 與其自身,顯然存在:sd[i]=i+1,sp[i]=i+1

2)i%prime[j]!=0

當(dāng)?i%prime[j]!=0 時(shí),i 中不包含 prime[j] 這個(gè)素因子,且 prime[j] 一定是 i*prime[j] 的最小素因子

那么由:?

得:

即有:sd[i*prime[j])=sd[i]*sd[prime[j]]

相應(yīng)的,sp[i*prime[j]]=sp[prime[j]]=prime[j]+1

3)i%prime[j]=0

當(dāng)?i%prime[j]=0 時(shí),i 中至少包含了一個(gè) prime[j]

那么由:?

得:

可以發(fā)現(xiàn),兩式唯一的不同在于:

那么:sd[i*prime[j]=sd[i] / (1) * (2)

即:sd[i*prime[j]=sd[i]/sp[i]*(sp[i]*prime[j]+1)

相應(yīng)的,sp[i*prime[j]]=sp[i]*prime[j]+1

int prime[N],cnt; bool bprime[N]; int sd[N],sp[N]; void getSd(int n){sd[1]=1;sp[1]=1;for(int i=2;i<=n;i++){if(!bprime[i]){prime[++cnt]=i;sd[i]=i+1;sp[i]=i+1;}for(int j=1;j<=cnt&&prime[j]*i<N;j++){int temp=prime[j]*i;bprime[temp]=true;if(i%prime[j]==0){sp[temp]=sp[i]*prime[j]+1;sd[temp]=sd[i]/sp[i]*sp[temp];break;}sd[temp]=sd[i]*sd[prime[j]];sp[temp]=prime[j]+1;}} } int main(){int n;scanf("%d",&n);getSd(n);for(int i=1;i<=n;i++)printf("%d\n",d[i]); }

【最高次冪】

對(duì)于一個(gè)整數(shù) n,若要求滿足 n=a^p 這個(gè)式子最大的 p,其中 n 可能是負(fù)數(shù),a、p 是整數(shù)

則可知:p = GCD(k1,k2,k3,...,kn)

比如:24 = 2^3*3^1,p 應(yīng)該是 GCD(3, 1) = 1,即:24 = 24^1

? ? ? ? ? 324 = 3^4*2^2,p應(yīng)該是 GCD(4, 2) = 2,即:324 = 18^2

int prime[N],cnt; bool bprime[N]; void make_prime(){memset(bprime,false,sizeof(bprime));for(int i=2;i<=N;i++){if(!bprime[i]){prime[cnt++]=i;for(LL j=i*2;j<=N;j+=i)bprime[j]=true;}} } int GCD(int a, int b){return a % b == 0 ? b : GCD(b, a % b); }int main(){makePrime();int n;scanf("%d",&n);bool flag=false;if(n<0){//負(fù)數(shù)的情況n=-;flag=true;}int res=0;for(int i=0;i<cnt&&prime[i]<=n;i++){if(n%prime[i]==0){//枚舉每一組的prime^kint k=0;while(n%prime[i]==0){k++;n/=prime[i];}//求p=GCD(k1,k2,...,kn)if(res==0)res=k;elseres=GCD(res,k);}}if(n>1)//若質(zhì)數(shù)除不盡res=GCD(res,1);if(flag){//負(fù)數(shù)時(shí),冪不可能為偶數(shù)while(res%2==0)res/=2;}printf("%d\n",res);return 0; }

【例題】

  • Mysterious Bacteria(LightOJ-1220)(最高次冪):點(diǎn)擊這里
  • Factors of Factorial(AtCoder-2286)(約數(shù)個(gè)數(shù)):點(diǎn)擊這里
  • Product of Three Numbers(CF-1294C)(約數(shù)個(gè)數(shù)):點(diǎn)擊這里
  • Aladdin and the Flying Carpet(LightOJ-1341)(枚舉約數(shù)):點(diǎn)擊這里
  • 炫酷數(shù)字(2019??秃偎惴ɑA(chǔ)集訓(xùn)營(yíng) Day5-G)(約數(shù)+構(gòu)造):點(diǎn)擊這里
  • Sigma Function(LightOJ-1336)(約數(shù)和+公式推導(dǎo)):點(diǎn)擊這里
  • 總結(jié)

    以上是生活随笔為你收集整理的数论 —— 约数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。