bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)
Description
Input
輸入含有多組數據,第一行一個正整數T,表示這個測試點內的數據組數。
接下來T行,每行有五個整數p,a,b,X1,t,表示一組數據。保證X1和t都是合法的頁碼。
注意:P一定為質數
Output
共T行,每行一個整數表示他最早讀到第t頁是哪一天。如果他永遠不會讀到第t頁,輸出-1。
Sample Input
3
7 1 1 3 3
7 2 2 2 0
7 2 2 2 1
Sample Output
1
3
-1
HINT
0<=a<=P-1,0<=b<=P-1,2<=P<=10^9
分析:
剛剛學了數列,看到這道題就不那么難受了
X[i+1]=(aX[i]+b)mod p
X[i+1]+u=a(X[i]+u)
(a-1)u=b
u=b/(a-1)
X[i+1]+u=(X[1]+u)*a^i
a^i=(X[i+1]+u)/(X[1]+u) (mod p)
已知X[i+1]
實際上就是
x^i=z (mod p),求解最小i
最后答案就是i+1
然而這只適用于a!=1的情況
當a==1的時候
這就是一個等差數列了
X[i+1]=X[1]+b*i
X[i+1]-X[1]=b*i
設x=i,z=X[i+1]-X[1]
式子就可以化簡成
b*i=z (mod p)
b*i+k*p=z
我們先用擴歐求解b*i+k*p=1
最后把答案*z+1就可以了
注意
如果z不是gcd(b,p)的倍數,那么無解
一開始我的算法是:
i=(X[i+1]-X[1])*inv(b)
但是這樣秒WA,我覺得一概是無法判斷無解導致的
注意:p一定為質數
這樣求逆元就可以用費馬小定理了
tip
注意特殊情況的特判
x1==t,ans=1
a==0&&b==t,ans=2
a==0&&b!=t,ans=-1
一直連WA,最后才發現是主程序的問題
一個輸出后忘了回車!!!
轉載于:https://www.cnblogs.com/wutongtong3117/p/7673239.html
總結
以上是生活随笔為你收集整理的bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]oracle的表导入导出,表空间
- 下一篇: WIncc7.4入门