求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...