题解:
将原式处理成A^x≡B(mode C)的形式即可。
代码:
#include<map> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long long ll fastpow(ll x,ll y,ll p) { ll ret = 1ll; while(y) { if(y&1)ret=ret*x%p; x=x*x%p; y>>=1; } return ret; } ll F2(ll y,ll z,ll p) { y%=p,z%=p; ll ret = fastpow(y,p-2,p); return ret*z%p; } map<ll,ll>mp; void BSGS(ll y,ll z,ll p) { y%=p,z%=p; if(!y&&z) { printf("-1\n"); return ; } mp.clear();mp[1]=0; ll now = 1;ll m = (ll)sqrt(p); for(ll i=1;i<=m;i++) { now=now*y%p; if(mp.find(now)==mp.end()) mp[now]=i; } ll u = 1; for(ll i=0;i<=m+2;i++) { ll tmp = F2(u,z,p); if(mp.find(tmp)!=mp.end()) { ll ans = mp[tmp]; printf("%lld\n",ans+i*m+1); return ; } u=u*now%p; } printf("-1\n"); } ll T,p,a,b,x1,t; int main() { scanf("%lld",&T); while(T--) { scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t); a%=p,b%=p; if(x1==t) { printf("1\n"); continue; } if(!a) { if(b==t)printf("2\n"); else printf("-1\n"); continue; } if(a==1) { if(!b&&t-x1) { printf("-1\n"); }else printf("%lld\n",F2(b,t-x1+p,p)+1); continue; } ll k = (ll)F2(a-1,b,p); BSGS(a,(t+k)*fastpow(x1+k,p-2,p),p); } return 0; }
本文深入解析了模指数运算及其在快速幂算法中的应用,并详细介绍了Baby Step Giant Step (BSGS)算法解决离散对数问题的过程。通过具体代码实现展示了如何使用BSGS算法求解特定形式的方程,适用于数学竞赛和计算机科学领域的学习者。

被折叠的 条评论
为什么被折叠?



