P3846-[TJOI2007]可爱的质数【BSGS,数论】
正題
題目鏈接:https://www.luogu.org/problemnew/show/P3846
題目大意
BL≡N(modP)B^L\equiv N(mod\ P)BL≡N(mod?P)
求最小的LLL。
解題思路
首先為了順眼改一下變量名
Ax≡B(modP)A^x\equiv B(mod\ P)Ax≡B(mod?P)
然后我們設x=i?t?j(0≤i≤t,0≤j≤t?1)x=i*t-j(0\leq i\leq t,0\leq j\leq t-1)x=i?t?j(0≤i≤t,0≤j≤t?1)其中t=?P?t=\lceil \sqrt P\rceilt=?P??
這樣xxx就可以表示任何值
Ai?t?j≡B(modP)A^{i*t-j}\equiv B(mod\ P)Ai?t?j≡B(mod?P)
(At)i≡B?Aj(modP)(A^t)^i\equiv B*A^j(mod\ P)(At)i≡B?Aj(mod?P)
那我們可以枚舉jjj的所有值并用hashhashhash保存下來B?Aj%PB*A_j\%PB?Aj?%P的所有可能值。
然后枚舉iii讓(At)i%P(A^t)^i\% P(At)i%P與B?AJ%PB*A_J\%PB?AJ?%P的值匹配就好了。
因為這里是用mapmapmap實現的
時間復雜度:O(nlogn):O(\sqrt n\ log\sqrt n):O(n??logn?)
codecodecode
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<map> #define ll long long using namespace std; ll p,b,n,ans=1e18,t; map<ll,ll> v; ll power(ll x,ll b) {ll ans=1;while(b){if(b&1) ans=ans*x%p;x=x*x%p;b>>=1;}return ans; } int main() {scanf("%lld%lld%lld",&p,&n,&b);t=(int)sqrt(p)+1;for(ll i=0;i<t;i++){ll val=b*power(n,i)%p;v[val]=i;}n=power(n,t);if(n==0) {if(!b) printf("1");else printf("no solution");return 0;}for(ll i=0;i<=t;i++){ll val=power(n,i);ll j=v.find(val)==v.end()?-1:v[val];if(j>=0&&i*t-j>=0) ans=min(ans,i*t-j);}if(ans==1e18) printf("no solution");else printf("%lld",ans); }總結
以上是生活随笔為你收集整理的P3846-[TJOI2007]可爱的质数【BSGS,数论】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IEM是什么
- 下一篇: P5021-赛道修建【平衡树,贪心,二分