题意求A^B的所有约数(即因子)之和,并对其取模 9901再输出。用到下面三个数学公式和定理
整数的唯一分解定理:
任意正整数都有且只有一种方式写出其素因子的乘积表达式。
A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 其中pi均为素数
约数和公式:
对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)
有A的所有因子之和为
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)
同余模公式:
(a+b)%m=(a%m+b%m)%m
(a*b)%m=(a%m*b%m)%m
代码如下
#include<stdio.h>
#include<math.h>#define size 10000
#define mod 9901
__int64 sum(__int64 p,__int64 n);
__int64 power(__int64 p,__int64 n);
__int64 sum(__int64 p,__int64 n)
{
if(n==0)
return 1;
if(n%2)
return (sum(p,n/2)*(1+power(p,n/2+1)))%mod;
else
return (sum(p,n/2-1)*(1+power(p,n/2+1))+power(p,n/2))%mod;
}
__int64 power(__int64 p,__int64 n)
{
__int64 sq=1;
while(n>0)
{
if(n%2)
sq=(sq*p)%mod;
n/=2;
p=p*p%mod;
}
return sq;
}
void main()
{
int A,B,i,k,ans;
int p[size];
int n[size];
while(scanf("%d%d",&A,&B)!=EOF)
{
k=0;
for(i=2;i*i<=A;)
{
if(A%i==0)
{
p[k]=i;
n[k]=0;
while(!(A%i))
{
n[k]++;
A/=i;
}
k++;
}
if(i==2)
i++;
else
i+=2;
}
if(A!=1)
{
p[k]=A;
n[k++]=1;
}
ans=1;
for(i=0;i<k;i++)
ans=(ans*(sum(p[i],n[i]*B)%mod))%mod;
printf("%I64d\n",ans);
}
}