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\leqslant a\leqslant P-1,0\leqslant b\leqslant P-1,2\leqslant P\leqslant10^9\)


我们推推式子可以发现

\[X_n=a^{n-1}X_1+\sum\limits_{i=0}^{n-2}a^ib
\]

然后后面那玩意显然是等比数列,然后我们就可以得到

\[\begin{align}X_n&=a^{n-1}X_1+\dfrac{b(1-a^{n-1})}{1-a}\nonumber\\&=a^{n-1}X_1+\dfrac{b}{1-a}-\dfrac{ba^{n-1}}{1-a}\nonumber\\&=a^{n-1}(X_1-\dfrac{b}{1-a})+\dfrac{b}{1-a}\nonumber\\\Longrightarrow\dfrac{X_nb}{1-a}&=a^{n-1}(X_1-\dfrac{b}{1-a})\nonumber\end{align}
\]

然后直接用扩展BSGS就好了

/*program from Wolfycz*/
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
#define Fi first
#define Se second
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
template<typename T>inline T frd(T x){
int f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
template<typename T>inline T read(T x){
int f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
map<int,int>Mp;
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int mlt(int a,int b,int p){
int res=1;
for (;b;b>>=1,a=1ll*a*a%p) if (b&1) res=1ll*res*a%p;
return res;
}
int BSGS(int a,ll c,int p){
Mp.clear();
if (a==c) return 1;
int lmt=(int)sqrt(p);
for (int i=0;i<lmt;i++){
int res=1ll*c*mlt(a,i,p)%p;
map<int,int>::iterator it=Mp.find(res);
if (it==Mp.end()) it=Mp.insert(map<int,int>::value_type(res,i)).Fi;
it->Se=i;
}
for (int i=1;i*lmt<p;i++){
int res=mlt(a,i*lmt,p);
map<int,int>::iterator it=Mp.find(res);
if (it!=Mp.end()) return i*lmt-it->Se;
}
return -1;
}
int main(){
for (int Data=read(0);Data;Data--){
int p=read(0),a=read(0),b=read(0),k=read(0),t=read(0);
if (k==t){
printf("1\n");
continue;
}
if (!a){
printf(b==t?"2\n":"-1\n");
continue;
}
if (a==1){
int Ans=1ll*(t-k)*mlt(b,p-2,p)%p;
printf(!b?"-1\n":"%d\n",(Ans+p)%p+1);
continue;
}
ll x=t-1ll*a*t-b,y=k-1ll*a*k-b;
if ((x<0&&y>0)||(x>0&&y<0)){
printf("-1\n");
continue;
}
x=abs(x)%p,y=abs(y)%p;
int c=1ll*x*mlt(y,p-2,p)%p;
int Ans=BSGS(a,c,p);
printf(!~Ans?"-1\n":"%d\n",Ans+1);
}
return 0;
}

[SDOI2013]随机数生成器的更多相关文章

  1. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  2. bzoj3122 [SDOI2013]随机数生成器

    bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...

  3. 洛咕 P3306 [SDOI2013]随机数生成器

    洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...

  4. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  5. 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

    [bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t /* http: ...

  6. 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)

    题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...

  7. bzoj 3122: [Sdoi2013]随机数生成器

    #include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...

  8. bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)

    Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.    接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...

  9. BZOJ3122: [Sdoi2013]随机数生成器(BSGS)

    题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...

  10. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

随机推荐

  1. shell之起步

    初学者,先不要考虑好不好看,效率高不高!先要实现需求!需求是第一位! grep.sed.awk.三剑客! 学好shell,需要前提! 1.linux系统命令熟练 2.搞清楚正则,grep.sed.aw ...

  2. 单页导航菜单视觉设计HTML模板

    单页导航菜单视觉设计HTML模板,视觉,企业,html,单页,单页导航菜单视觉设计HTML模板是一款磨砂背景的大气时尚HTML设计网页模板 http://www.huiyi8.com/moban/

  3. redis压力测试详解

    redis做压测可以用自带的redis-benchmark工具,使用简单,效果也比较不错. linux下一般无需下载,windows下redis-benchmark压力测试工具下载地址:http:// ...

  4. Java的访问权限修饰符

    default或者friendly表示默认的访问权限修饰符.

  5. codeforces 705C C. Thor(模拟)

    题目链接: C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  6. codeforces 659C C. Tanya and Toys(水题+map)

    题目链接: C. Tanya and Toys time limit per test 1 second memory limit per test 256 megabytes input stand ...

  7. DBSCAN 聚类分析

    DBSCANCLUSTER DBSCAN(Density-basedspatial clustering ofapplications with noise)Martin.Ester, Hans-Pe ...

  8. 使用Tornado作为Django App的服务器

    闲来无事,折腾折腾. 老是听说tonado是个异步web框架和服务器,作为框架倒是了解到了,但是服务器一直不太懂.所以决定了解一下,既然可以做服务器,那就把自己的django app部署到这上边去. ...

  9. 监测GPU使用情况命令

    每2秒监测一次:watch -n 2 nvidia-smi

  10. Sleep 比对 (Win32API 与 STL )

    OutputDebugStringA("begin 1========"); for (int i = 0; i < 1800; i++) { Sleep(2); } Out ...