0求A^B的所有因子的和(A,B<=50000000)
把A分解
最后就是cnt个等比数列求和再相乘
然而用等比数列求和公式的时候,有可能因子 mod 9901之后得1,等比数列公式就不对了
所以需要特殊判断,也就是这里卡了我很久很久。。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=100000;
const int MOD=9901;
int prime[MAXN+1];
void getPrime()
{
memset(prime,0,sizeof(prime));
for (int i=2;i<=MAXN;i++){
if (!prime[i]) prime[++prime[0]]=i;
for (int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++){
prime[prime[j]*i]=1;
if (i%prime[j]==0) break;
}
}
}
int factor[100][2];
int getFactors(int x)
{
int fatcnt=0;
int tmp=x;
for (int i=1;prime[i]<=tmp/prime[i];i++){
factor[fatcnt][1]=0;
if (tmp%prime[i]==0){
factor[fatcnt][0]=prime[i];
while (tmp%prime[i]==0){
factor[fatcnt][1]++;
tmp/=prime[i];
}
fatcnt++;
}
}
if (tmp!=1){
factor[fatcnt][0]=tmp;
factor[fatcnt++][1]=1;
}
return fatcnt;
}
int fast(int a,long long b)
{
if (b==1) return a;
int ret=fast(a,b>>1);
ret=(ret*ret)%MOD;
if (b&1) ret*=a;
return ret%MOD;
}
int cacl(int a_,long long b_)
{
int ret=fast(a_%MOD,b_+1);
ret=(ret+MOD-1)%MOD;
ret*=fast((a_-1)%MOD,MOD-2);
ret%=MOD;
if (ret==0) return (b_%MOD+1)%MOD;
else
return ret;
}
int main(int argc, const char * argv[])
{
int i,j,m,n,k,cnt,a,ans;
long long b;
getPrime();
while (cin>>a>>b)
{
ans=1;
cnt=getFactors(a);
for (i=0;i<cnt;i++)
{
long long t=b*factor[i][1];
ans=(ans*cacl(factor[i][0],t))%MOD;
}
if (a==0) ans=0;
printf("%d\n",ans);
}
return 0;
}