标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 19009 | Accepted: 4773 |
Description
Input
Output
Sample Input
2 3
Sample Output
15
Hint
Source
题目大意:
求
解题思路:
首先 对
素因子分解完之后
题是 逆元可能不存在,那么怎么办呢,我们就用到了一个公式:
进行快速幂的时候,中间有可能爆
以了。
/**
2016 - 08 - 08 下午
Author: ITAK
Motto:
今日的我要超越昨日的我,明日的我要胜过今日的我,
以创作出更好的代码为目标,不断地超越自己。
**/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 1e9+5;
const int MAXN = 1e6+5;
const LL MOD = 9901;
const double eps = 1e-7;
const double PI = acos(-1.0);
using namespace std;
LL p[MAXN];
int k = 0;
bool prime[MAXN];
void isprime()
{
k = 0;
memset(prime, 0, sizeof(prime));
prime[1] = 1;
for(int i=2; i<MAXN; i++)
{
if(!prime[i])
{
p[k++] = i;
for(int j=i+i; j<MAXN; j+=i)
prime[j] = 1;
}
}
}
LL fac[MAXN/100], num[MAXN/100];
int cnt = 0;
void Dec(LL x)
{
cnt = 0;
memset(num, 0, sizeof(num));
for(int i=0; p[i]*p[i]<=x; i++)
{
if(x%p[i] == 0)
{
fac[cnt] = p[i];
while(x%p[i] == 0)
{
num[cnt]++;
x /= p[i];
}
cnt++;
}
}
if(x > 1)
{
fac[cnt] = x;
num[cnt++] = 1;
}
}
LL multi(LL a, LL b, LL c)
{
LL ans = 0;
while(b)
{
if(b & 1)
ans = (ans+a)%c;
b>>=1;
a = (a+a)%c;
}
return ans;
}
LL quick_mod(LL a, LL b, LL c)
{
LL ans = 1;
while(b)
{
if(b & 1)
ans = multi(ans, a, c);///可能爆 long long
b>>=1;
a = multi(a, a, c);
}
return ans;
}
int main()
{
isprime();
LL A, B;
while(~scanf("%lld%lld",&A,&B))
{
Dec(A);
LL ans = 1, x, y, tmp;
for(int i=0; i<cnt; i++)
{
LL MM = MOD*(fac[i]-1);///MM * MM 容易爆 long long
tmp = quick_mod(fac[i], num[i]*B+1, MM);
tmp--;
tmp = (tmp%MM+MM)%MM;
tmp /= (fac[i]-1);
ans = (ans*tmp)%MOD;
}
ans = (ans%MOD+MOD)%MOD;
printf("%lld\n",ans);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/qingshui23/article/details/52154321