Codeforces - 919E - Congruence Equation
2018-02-01 15:56
288 查看
Codeforces - 919E - Congruence Equation
可以发现 P=p×(p−1) 是 n×an(mod p) 的循环节
但 p×(p−1) 太大,考虑到 ap−1≡1(mod p),令 n=i×(p−1)+j :
n×an≡b(mod p)n×ai×(p−1)+j≡b(mod p)n=b×a−j(mod p)i×(p−1)+j=b×a−j(mod p)j−i=b×a−j(mod p)。
根据 j 从 1 到 p−1 枚举求出 i 然后就能求出 n 了,然后 n,n+P,n+2P,... 就是合法的解了。
本题的关键在于找到循环节然后将 n 拆解至根号复杂度枚举求解。。。
可以发现 P=p×(p−1) 是 n×an(mod p) 的循环节
但 p×(p−1) 太大,考虑到 ap−1≡1(mod p),令 n=i×(p−1)+j :
n×an≡b(mod p)n×ai×(p−1)+j≡b(mod p)n=b×a−j(mod p)i×(p−1)+j=b×a−j(mod p)j−i=b×a−j(mod p)。
根据 j 从 1 到 p−1 枚举求出 i 然后就能求出 n 了,然后 n,n+P,n+2P,... 就是合法的解了。
本题的关键在于找到循环节然后将 n 拆解至根号复杂度枚举求解。。。
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll powm(ll a, ll b, ll p) { ll c = 1; while(b) { if(b&1) c=c*a%p; a=a*a%p; b>>=1; } return c; } int main() { ll a,b,x,p; scanf("%I64d%I64d%I64d%I64d",&a,&b,&p,&x); ll ans = 0; ll P = p*(p-1); for(ll j=1;j<p;++j) { ll c = b*powm(powm(a,j,p),p-2,p)%p; ll i = (j-c+p)%p; ll n = (i*(p-1)+j)%P; if(n==0) n=P; ans+=x/P+(x%P>=n); } printf("%I64d\n",ans); }
相关文章推荐
- Codeforces 919E 小学数学入门
- [Codeforces 919E]Congruence Equation
- Codeforces 919E - Congruence Equation【数论-欧拉降幂】
- 【CodeForces - 919E】 Congruence Equation 【费马小定理 + 思维】
- CodeForces 547A--找循环节
- codeforces contest 358
- Codeforces 837D - Round Subset 【DP】
- codeforces 333B - Chips
- codeforces 544D Destroying Roads (最短路)
- Codeforces 161D Distance in Tree
- CodeForces - 357C C - Knight Tournament 并查集or set模拟
- CodeForces - 808D Array Division
- codeforces 13A. Numbers
- codeforces 550B Preparing Olympiad(枚举)
- CodeForces 688A-Opponents
- CodeForces 735D - Taxes
- CodeForces - 607B
- codeforces 328A. IQ Test
- Codeforces 556B Case of Fake Numbers 数字转盘
- CodeForces 166A Rank List