cf 460 E. Congruence Equation 數學題
阿新 • • 發佈:2018-02-02
pow ble 兩個 ebe post long long -c 數學題 its
於是\(p * k + mm = p * q - q + i\)
在模p意義下可以得到
\(q \equiv (i - mm)\ (mod) p\)
cf 460 E. Congruence Equation 數學題
題意:
給出一個x 計算<=x的滿足下列的條件正整數n的個數
\(p是素數,2?≤?p?≤?10^{6}?+?3, 1?≤?a,?b?<?p, 1?≤?x?≤?10^{12}\)
思路:
題目中存在兩個循環節 \(n % p\) 和 \(a ^ n % p\), 循環節分別為\(p,p-1\)
我們枚舉\(i = n\ (mod)\ (p - 1)\)
可以得到兩個方程
\[ n\ \equiv\ i\ mod\ (p-1) \]
\[ n \equiv \frac{b}{a ^ i}\ mod\ p\]
令$mm = \frac{b}{a ^ i} $
設 \[n = p * k + mm , n = (p - 1) * q + i \]
於是\(p * k + mm = p * q - q + i\)
在模p意義下可以得到
\(q \equiv (i - mm)\ (mod) p\)
然後就可以根據限制條件計算出有多少個滿足條件的q 即答案了
#include<bits/stdc++.h> #define LL long long using namespace std; LL qpow(LL x,LL y,LL mod){ x %= mod; LL ans = 1; while(y){ if(y & 1) ans = ans * x % mod; x = x * x % mod; y >>= 1; } return ans; } int main(){ LL a,b,p,X; cin>>a>>b>>p>>X; LL x,y,m = b,inva = qpow(a, p - 2,p); LL ans = 0; for(int i = 0;i < p - 1;i++){ LL mm = (i - m + p) % p; LL R = (floor)((1.0 * (X - i) / (p -1) - mm)/p) ; LL L = mm / p; // for(int j = L;j <= R;j++) cout<<(p * j + mm) * (p - 1) + i<<" "; m = m * inva % p; ans += R - L + 1; } cout<<ans<<endl; return 0; }
cf 460 E. Congruence Equation 數學題