POJ1845 Sumdiv
http://poj.org/problem?id=1845
数学
很容易想到,将数\(A\)进行质因数分解,然后计算因数和即可
我调了\(1.5h\),数学真的烂\(QAQ\)
注意:调代码一定不要浮躁,不要觉得自己的代码没有问题
#include<iostream>
#include<cstdio>
#include<cmath>
#define N 1000005
#define int long long
using namespace std;
long long mod=9901;
int cnt,fa,a,b,c[N][2];
long long n,m;
inline long long ksm(long long x,long long y)
{
long long ans=1;
while (y)
{
if (y&1)
ans=ans*x%mod;
x=x*x%mod;
y >>=1;
}
return ans;
}
inline void ins(int x)
{
++cnt;
c[cnt][0]=x;
c[cnt][1]=0;
while (fa%x==0)
{
c[cnt][1]++;
fa/=x;
}
}
long long ef(long long x,long long y)
{
if (y==1)
return 1ll;
long long z=ef(x,y/2);
if (y%2==0)
return (z+z*ksm(x,y/2)%mod)%mod; else
return ((z+z*ksm(x,y/2)%mod)%mod+ksm(x,y-1))%mod;
}
signed main()
{
while (scanf("%lld%lld",&a,&b)==2)
{
cnt=0;
int g=(int)sqrt(a);
fa=a;
for (int i=2;i<=g;i++)
if (fa%i==0)//爆炸点1:把fa/i也丢进去,当成了寻找因数(实际是要寻找所有质因数及其次数)
ins(i);
if (fa!=1)//爆炸点2:判fa!=a,同上,当成了寻找因数
{
cnt++;
c[cnt][0]=fa;
c[cnt][1]=1;
}
long long ans=1;
for (int i=1;i<=cnt;i++)
{
n=c[i][0];
m=c[i][1];
long long cs=m*b;
n%=mod;
ans=ans*ef(n,cs+1)%mod;
}
ans=(ans%mod+mod)%mod;
cout << ans << endl;
}
return 0;
}