最初觉得是水题,后来认识到是大数据。抑郁的小火苗果断的燃烧了起来。。。尼玛居然有公式!!!现成的公式!可惜数学知识不太广泛。
这题需要的关于同余模公式和约数和公式实在是。。。太好用了。虽然我知道的不太早。
对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)1.S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)
2.(a+b)%m=(a%m+b%m)%m (a*b)%m=(a%m*b%m)%m
然后事情就变得明朗起来了~~~
整数分解掉然后再利用递归套公式以及计算公式.~
#include<stdio.h>
long long int ff(int x,long long int y)
{
long long int g;
if(y==1) return x;
if(y==0) return 1;
if(y%2==0)
{
g=ff(x,y/2)%9901;
return g*g%9901;
}
else
{
g=ff(x,y/2)%9901;
return ((g*g)%9901)*x%9901;
}
}
long long int fg (int x,long long int y)
{
long long int t,k1,k2;
if(y==1)
return (1+x)%9901;
if(y==0)
return 1;
if(y%2==1)
{
t=(y+1)/2;
k1=(ff(x,t)+1)%9901;
k2=fg(x,t-1)%9901;
return k1*k2%9901;
}
else
{
k1=ff(x,y)%9901;
k2=fg(x,y-1)%9901;
return (k1+k2)%9901;
}
}
int main()
{
int n,m,i,s,x,t,j,a[10010],b[10000];
long long int y,g;
scanf("%d%d",&n,&m);
for(i=1;i<=10000;i++)
a[i]=0;
a[1]=1;
for(i=2;i<=10000;i++)
if (a[i]==0)
{
for(j=2;j<=10000/i;j++)
a[i*j]=1;
}
t=0;
for(i=1;i<=10000;i++)
if(a[i]==0) b[++t]=i;
s=1;
for(i=1;i<=t;i++)
if(n%b[i]==0)
{
x=b[i];
y=0;
while(1)
{
if (n%x==0) {n=n/x;y++;}
else break;
}
g=fg(x,y*m)%9901;
s=s*g%9901;
}
if (n!=1)
{
s=s*fg(n,m)%9901;
}
printf("%d\n",s);
return 0;
}
搞定。敲完。