#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 999911659; //是一个质数
ll g, n, prime[10], a[10];
/*
999911658分解质因数结果为 2,3,4679,35617
*/
ll factor[1600], cnt;
void divide(ll x)
{
for(ll i = 1; i <= x / i; i++)
{
if(x % i == 0)
{
factor[++cnt] = i;
if(i != n / i) factor[++cnt] = n / i;
}
}
}
ll qmi(ll a, ll b, ll p)
{
ll res = 1; res %= p;
while(b)
{
if(b & 1) res = res * a % p, res %= p;
a = a % p * a % p;
a %= p;
b >>= 1;
}
return res % p;
}
ll C(ll a, ll b, ll p)
{
if(b > a) return 0;
if(b > a - b) b = a - b;
ll x = 1, y = 1;
for(int i = 0; i < b; i++)
{
x = x * (a - i) % p;
y = y * (i + 1) % p;
}
return x * qmi(y, p-2, p);
}
ll lucas(ll a, ll b, ll p)
{
if(b == 0) return 1;
return C(a%p, b%p, p) * lucas(a/p, b/p, p) % p;
}
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b == 0) {x = 1; y = 0; return a;}
ll d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
ll crt()
{
ll res = 0;
for(int i = 1; i <= 4; i++)
res = (res + a[i] * (mod-1)/prime[i] % (mod-1) * qmi((mod-1)/prime[i], prime[i]-2, prime[i])) % (mod-1);
return res;
}
int main()
{
cin >> n >> g;
/*
if(g % mod == 0)
{
puts("0");
return 0;
}
*/
divide(n);
memset(a, 0, sizeof a);
memset(prime, 0, sizeof prime);
prime[1] = 2; prime[2] = 3;
prime[3] = 4679; prime[4] = 35617;
for(int i = 1; i <= 4; i++)
{
ll tmp = 0;
for(int j = 1; j <= cnt; j++)
{
ll x = factor[j];
tmp += lucas(n, x, prime[i]) % prime[i];
tmp %= prime[i];
}
a[i] = tmp;
}
ll x = crt();
//cout << qmi(g, x, mod) << endl;
cout << qmi(g, x + mod - 1, mod) << endl;
return 0;
}
原文:https://www.cnblogs.com/zxytxdy/p/11809080.html