poj1845 數論好題

2021-07-12 00:06:42 字數 1248 閱讀 1191

求a^b的所有因數和。(a,b<=50000000)

分解質因數 a=a1^b1*a2^b2*...*an^bn

則 因數和為(a1^0+a1^1+...+a1^b1)*(a2^0+a2^1+...+a2^b2)*...(an^0+an^1+...+an^bn) (乘法原理)

a^b=a1^(b1*b)*a2^(b2*b)*...*an^(bn*b) 

因數和為(a1^0+a1^1+...+a1^(b1*n))*(a2^0+a2^1+...+a2^(b2*n))*...(an^0+an^1+...+an^(bn*n))

等比數列求和。。a1*(1-q^n)/(1-q)

逆元inv(0)不存在。。坑死。。所以inv(mo),inv(2*mo)...都不存在。。

而q-1=k*mo時,這一項就相當於b2*x+1個1相加。。然後就好辦了。。

對逆元的理解還是欠缺的。

#include#include#include#include#define n 100000

#define mo 9901

using namespace std;

int a,b,t,cnt;

long long ans=1;

int p[n],prime[n],counter[n];

long long pow(int a,int b,int p)

return ret;

}int main()

int t=(int)sqrt((double)a);

fill(p,p+n,1);p[0]=p[1]=0;cnt=0;

for(int i=2;i<=t;i++)

if(p[i])

int aa=a;

for(int i=1;i<=cnt;i++)

while(aa%prime[i]==0) aa/=prime[i],counter[i]++;

if(aa!=1&&aa!=0) prime[++cnt]=aa,counter[cnt]=1;

for(int i=1;i<=cnt;i++)

long long tmp=(pow(prime[i],counter[i]*b+1,mo)+mo-1)%mo;

ans=(ans*tmp)%mo;

ans=(ans*pow((prime[i]-1)%mo,mo-2,mo))%mo;

} printf("%lld\n",ans);

return 0;

}

POJ 1845 簡單數論

求a b的約數和模mod 對a質因子分解p1k1 p2k2.p kn a b既指數對應部分乘以b 對於每個p都有 1 p1 p2 p ki 的選擇 連乘每乙個p的等比數列之和即可 這裡用了分治法,我覺得有必要記一下,不然推錯就麻煩了 奇數部分sum p,c 1 p c 1 1 sum p,c 1 1...

poj1845 約數之和

本題應該說是乙個數學問題了。首先暴力肯定是不行的。首先我們把a分解質因數,表示為p1 c1 p2 c2 pn cn.那麼a b就可以表示為 p1 c1 b p2 c2 b pn cn b 那麼很明顯了,所有約數的集合就是p1 k1,p2 k2 pn kn.其中0 ki b ci 1 i n 到了這裡...

POJ 1845 逆元 分治

題意 傳送門 poj 1845 題解分解質因數 a p 1e1p 2e2 pnen a p 1 p 2 dots p n a p1e1 p2 e2 pne n 則約數和為 1 p1 p1e 1 1 p2 p2 e2 1 p n pnen 1 p 1 dots p 1 1 p 2 dots p 2 d...