题目链接:
http://codeforces.com/problemset/problem/919/E
题意:
\(n\) 的个数。
\(2 ≤ p ≤ 10^{6} + 3, 1 ≤ a, b < p, 1 ≤ x ≤ 10^{12}\).
题解:
因为:
\(p\)
\(a^{n} \mod p\)的循环节是 \(p-1\)。(费马小定理)
\(p*(p-1)\)。
\(p\)是质数。
\(n \mod p \equiv i, a^n\mod p\equiv a^j\).
\(a^n \mod p \equiv i\) ----①
$a^n\mod p\equiv a^j $ ----②
\(na^n\equiv b \pmod p\) ----③
\(i \times a^j \equiv b \pmod p\).
\(i\).
列出同余方程:
$i \equiv b*a^{-j} \pmod p $ ---①
\(i\equiv j \pmod {p-1}\) ---②
\(a^{-j}\) 是$ a^{j}$ 在 $\mod p $意义下的逆元。
\(i\) 的倍数都满足条件,除法统计一下即可。
\(O(p*logp)\)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpower(ll a,ll b, ll mod)
{
ll ans = 1;
while(b){
if(b&1) ans = ans * a % mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
ll a,b,mod,x;
int main(int argc, char const *argv[]) {
std::cin >> a >> b >> mod >> x;
ll ans = 0;
for(int i = 1;i <= mod-1;i++) {
ll c = qpower( qpower(a, i , mod) , mod - 2, mod) * b % mod;
ll n = ((mod-1) * (mod-1) * c + mod * i) % (mod * (mod-1));
ans += ( x / (mod * (mod-1)) ) + (x % (mod * (mod-1)) >= n );
}
std::cout << ans << '\n';
return 0;
}