这题在用pow的时候注意溢出,然后注意(p-1)%mod=0的情况还有就是p=1的情况
wa的我生无可恋啊!!!!!!终于过了
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double llb;
const int maxn = 10000;
const int mod =9901;
bool isp[10200];
ll prime[10200], tot;
ll a, b;
ll muiti(ll a, ll b, ll n)
{
a %= n;
b %= n;
ll c = (long double)a*b / n;
ll ans = a*b - c*n;
if (ans < 0)
ans += n;
else
if (ans >= n)ans -= n;
return ans;
}
void getprime()
{
tot = -1;
for (int i = 2; i <= maxn; i++)
{
if (isp[i] == 0)
prime[++tot] = i;
for (int j= 0; j <=tot; j++)
{
if (prime[j] * i > maxn)break;
if (i%prime[j] == 0)
{
isp[prime[j] * i] = 1;
}
isp[prime[j] * i] = 1;
}
}
}
ll pow(ll p,ll n,ll mod)//因为mod最大可达到10位所以如果你这用普通乘法就gg了,这里我们采用的muiti是<<算法竞赛进阶指南>>里讲的long long 数的乘法当然你也可以用快速加法
{
ll times = p%mod;
ll ans = 1;
while (n)
{
if (n & 1)
{
ans=muiti(ans, times, mod);
}
n >>= 1;
times = muiti(times, times, mod);
//times *= times,times%=mod;
}
return ans%mod;
}
int main()
{
getprime();
while (scanf("%lld%lld", &a, &b) != EOF)
{
ll ans = 1;
ll ttemp = a;
for (int i = 0; i <= tot; i++)
{
if (a%prime[i] == 0)
{
ll temp = a;
ll tot = 0;
while (temp%prime[i] == 0)
{
tot++;
temp /= prime[i];
ttemp /= prime[i];
}
ll times1 = tot*b + 1;
ll p1 = prime[i];
ll p2 = prime[i]-1;
ll ans1 = pow(p1, times1,p2*mod)-1;
ans1 = (ans1 % (p2*mod) + p2*mod) % (p2*mod);
ans1 = ans1/p2;
ans1 = (ans1 % mod + mod) % mod;
ans *= ans1;
ans %= mod;
}
}
if (ttemp != 1)
{
ll times1 = b + 1;
ll p1 = ttemp;
ll p2 = ttemp-1;
ll ans1 = pow(p1, times1, p2*mod)-1;
ans1 = (ans1 % (p2*mod) + p2*mod) % (p2*mod);
ans1=ans1/ p2;
ans1 = ((ans1%mod) + mod) % mod;
ans *= ans1;
ans %= mod;
}
if (a == 0 || b == 0)
{
if (a == 0)
printf("0\n");
else
printf("1\n");
}
else
printf("%lld\n", ans);
}
return 0;
}