φ(* ̄0 ̄)3337. poj1845 sumdiv题解
遇到数论题就要推式子!
提供最美丽的latex
\[a^b=p_1^{a_1*b}*p_2^{a_2*b}*p_3^{a_3*b}......*p_n^{a_n*b}
\]
那么他的因数之和为:
\[( {p_1}^0+ {p_1}^1+...+ {p_1}^{a_1*b})
\]
\[*( {p_2}^0+ {p_2}^1+...+ {p_2}^{a_2*b})
\]
\[\\...\newline
\]
\[*( {p_n}^0+ {p_n}^1+...+ {p_n}^{a_n*b})\newline
\]
\[\\=> 利用等比数列:{p_1^{{a_1*b}+1}-1\above 1pt p_1-1}*
{p_2^{{a_2*b}+1}-1\above 1pt p_2-1}... {p_n^{{a_n*b}+1}-1\above 1pt p_n-1}
\]
分析时间复杂度
\[\sqrt a:分解
\\log2(a)*log2(b):快速幂
\\log2(a):逆元
\\
\sqrt{5e7}*(log2(5e7)+log2(5e7)
\\≈7071*(26+26)
\\=特别快
\]
ACcode
#include<bits/stdc++.h>
using namespace std;
int x,y,a,b,cnt,flag,m=9901;
void ojld(int a,int b){
if(!b){
x=1;
y=0;
return;
}
ojld(b,a%b);
int t=y;
y=x-a/b*t;
x=t;
return;
}
int pw(int a,int b){
int sum=1;
while(b){
if(b&1){
sum=(sum%m*a%m+m)%m;
}
b>>=1;
a=(a%m*a%m+m)%m;
}
return sum%m;
}
signed main(){
cin>>a>>b;
int ans=1;
for(int i=2;a!=1;i++){
int zhi=0;
if(a%i==0){
while(a%i==0){
a/=i;
zhi++;
}
}
else{
continue;
}
int fz,fm;
fz=(pw(i,zhi*b+1)-1+m)%m;
int t=i-1;
ojld(t,m);
fm=(x%m+m)%m;
ans=(ans%m*fz%m*fm%m+m)%m;
}
cout<<ans%m;
return 0;
}