a^n mod c= a^(n mod phi(c) + phi(c)) mod c (n >= phi(c) )
n! mod phi(c) = 0 n!的因子只需包含 phi(c) 因为 这题phi(mod) 不会太大
然后所有的n! mod phi(c) 都等于0 最后问题转化成有多少个n ^ phi(c)mod p = b;
(a + b)^n = (a mod p + b mod p) ^ n (mod p)
所以这个式子是个长度为p的循环节
根绝循环节求结果就行了
#include<cstdio>
#include<algorithm>
#include<iostream>
#define LL unsigned long long
#define lson i<<1
#define rson (i<<1)+1
#define maxn 100005
// a^n mod c= a^(n mod phi(c) + phi(c)) mod c n >= phi(c)
using namespace std;
LL b, mod, M, am[maxn];
LL getEul(LL n)
{
LL ans = 1;
for(LL i = 2; i * i <= n; i++)
{
if(n % i == 0)
{
ans *= (i - 1);
while(n % i == 0)
{
n /= i;
ans *= i;
}
}
}
if(n > 1) ans *= n - 1;
return ans;
}
LL fastMod(LL a, LL x)
{
LL ans = 1;
while(x)
{
if(x & 1) ans *= a;
a *= a;
ans %= mod;
a %= mod;
x >>= 1;
}
return ans;
}
int main()
{
int t, i1 = 1;
scanf("%d", &t);
while(t--)
{
scanf("%I64u%I64u%I64u", &b, &mod, &M);
printf("Case #%d: ", i1++);
if(mod == 1)
{
if(M == 18446744073709551615ull)
{
printf("18446744073709551616\n");
}
else{
printf("%I64u\n", M + 1);
}
continue;
}
LL eu = getEul(mod);
//printf("%I64u\n", eu);
LL pre = 1;
LL i = 0;
LL ans = 0;
for( ; i <= M && pre < eu; i++)
{
if(fastMod(i, pre) == b) ans++;
pre *= (i + 1);
}
pre %= eu;
for( ; i<= M && pre; i++)
{
if(fastMod(i, pre + eu) == b) ans++;
pre *= (i + 1);
pre %= eu;
}
int cnt = 0;
for(int j = 0; i <= M && j < mod; j++ , i++)
{
if(fastMod(i, eu) == b) {ans++;cnt++;}
am[j] = cnt;
}
if(i <= M){
M-=i;
M+=1;
LL cir = M / mod;
ans += cnt * cir;
M -= cir * mod;
if(M > 0) ans += am[M - 1];
}
printf("%I64u\n", ans);
}
return 0;
}