题目:求出A^B的因子和modp的值
思路:利用sigma函数计算即可。sum=(p1^(k1*B+1)-1)/(p1-1)*...
然后就是将/(p1-1)转化成逆元去计算 就可以避免/运算。
但是这边有一个问题是 如果p|p1-1 那么逆元无解。wa情况。
思路:利用sigma函数计算即可。sum=(p1^(k1*B+1)-1)/(p1-1)*...
然后就是将/(p1-1)转化成逆元去计算 就可以避免/运算。
但是这边有一个问题是 如果p|p1-1 那么逆元无解。wa情况。
也就只能另外计算了。p1=k*p+1 因为对于乘法同余,所以值为(k1*B+1)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=50000;
const int mod=9901;
bool vis[maxn];
int prime[maxn],len=0;
void pri()
{
for(int i=2;i<maxn;i++)
{
if(!vis[i]) prime[len++]=i;
for(int j=0;j<len&&i*prime[j]<maxn;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
ll extend_gcd(ll a,ll b,ll &x,ll &y)
{
if(a==0&&b==0) return -1;//无最大公约数
if(b==0){x=1;y=0;return a;}
ll d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll mod_reverse(ll a,ll n)
{
ll x,y;
ll d=extend_gcd(a,n,x,y);
if(d==1) return (x%n+n)%n;
else return -1;
}
ll pow_mod(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
a=a*a%mod;
b>>=1;
}
return ans%mod;
}
int main()
{
//freopen("in.txt","r",stdin);
pri();
int n,b;
while(scanf("%d%d",&n,&b)!=EOF)
{
//cout<<n<<" "<<b<<endl;
if(n==0){printf("%d\n",n);continue;}
if(n==1||b==0){printf("1\n");continue;}
int en=sqrt(n+0.5),ans=1;
for(int i=0;i<len&&prime[i]<=n;i++)
{
int temcou=0,temans=1;
if(n%prime[i]==0)
{
//printf("%d->",prime[i]);
int k=prime[i]%mod;
while(n%prime[i]==0)
{n/=prime[i];temcou++;temans=temans*k%mod;}
if(k!=1)
{ll subans=((pow_mod(temans,b)*k)%mod-1+mod)%mod;///p^(k1*b+1)
ll b_reverse=mod_reverse(prime[i]-1,mod);
// printf("subans: %I64d b_reverse:%I64d\n",subans,b_reverse);
ans*=subans*b_reverse%mod;
}
else ans*=temcou*b+1;
ans%=mod;
}
}
if(n>1)
{
int k=n%mod;
//printf("----%d\n",k);
if(k!=1)
{ll subans=((pow_mod(k,b)*k)%mod-1+mod)%mod;///p^(b+1)
ll b_reverse=mod_reverse(n-1,mod);///n-1和mod是倍数
ans*=subans*b_reverse%mod;}
else ans*=(b+1)%mod;
ans%=mod;
}
printf("%d\n",ans%mod);
}
return 0;
}