题目链接:随机数生成器

  经典数学题……

  为了方便接下来的处理,我们可以先把\(X_1=t\)的情况特判掉。

  当\(a=0\)的时候显然只需再判一下\(b\)是否等于\(t\)即可。

  当\(a=1\)的时候就变成了一次的同余方程,直接用拓展欧几里得解出来即可。

  当\(a>1\)的时候可以等比数列求和,对于\(i>1\),得到\(X_i=a^{i-1}X_1+\frac{a^{i-1}-1}{a-1}b\)。

  由于\(p\)是质数,那么\(a-1\)就有逆元。于是移下项,最后剩下一个形如\(a^{i-1}\equiv y \pmod p\)的方程,大步小步解出来即可。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define mod 2000029 using namespace std;
typedef long long llg; int T,a,b,x1,t,p;
struct hash{
int head[mod],next[mod],c[mod],tt,d[mod],ld;
int to[mod]; bool vis[mod];
int find(int now){
int u=now%mod;
for(int i=head[u];i;i=next[i])
if(to[i]==now) return i;
return 0;
}
void insert(int now,int i){
int u=now%mod,v;
if((v=find(now))){c[v]=i;return;}
if(!vis[u]) vis[u]=1,d[++ld]=u; c[++tt]=i;
to[tt]=now; next[tt]=head[u]; head[u]=tt;
}
void finalize(){
for(int i=1;i<=ld;i++) vis[d[i]]=0,head[d[i]]=0;
ld=0; tt=0;
}
}A; int gcd(int x,int y){
int r=x%y;
while(r) x=y,y=r,r=x%y;
return y;
} int exgcd(int a,int b,int &x,int &y){
if(!b){x=1;y=0;return a;}
int aa=exgcd(b,a%b,x,y),bb=x;
x=y; y=bb-1ll*(a/b)*y%p; if(y<0) y+=p;
return aa;
} int mi(int a,int b){
int s=1;
while(b){
if(b&1) s=1ll*s*a%p;
a=1ll*a*a%p; b>>=1;
}
return s;
} int main(){
File("a");
scanf("%d",&T);
while(T--){
scanf("%d %d %d %d %d",&p,&a,&b,&x1,&t);
if(x1==t){printf("1\n");continue;}
if(a==0) printf(b==t?"2\n":"-1\n");
else if(a==1){
int X=t-x1,x,y,q;
if(X<0) X+=p; q=exgcd(b,p,x,y);
if(X%q) printf("-1\n");
else{
x=1ll*x*(X/q)%p; x%=1ll*(p/q)*(b/q);
printf("%d\n",x+1);
}
}
else{
b=1ll*b*mi(a-1,p-2)%p; t+=b;
t=1ll*t*mi(x1+b,p-2)%p;
int N=sqrt(p)+1,y=mi(a,N),ans=p+1;
for(int i=0,x=t;i<N;i++) A.insert(x,i),x=1ll*x*a%p;
for(int i=1,j=N,x=y,u;j<=p+N;j+=N,i++,x=1ll*x*y%p)
if((u=A.find(x))) ans=min(ans,i*N-A.c[u]);
if(ans==p+1) printf("-1\n");
else printf("%d\n",ans+1);
A.finalize();
}
}
return 0;
}

BZOJ 3122 【SDOI2013】 随机数生成器的更多相关文章

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

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

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

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

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

    BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...

  4. bzoj 3122: [Sdoi2013]随机数生成器【BSGS】

    题目要求的是: \[ ...a(a(a(ax+b)+b)+b)+b...=a^nx+a^{n-1}b+a^{n-2}b+...+b\equiv t(mod\ p) \] 后面这一大坨看着不舒服,所以考 ...

  5. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

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

  6. BZOJ 3122 SDOI2013 随机数发生器 数论 EXBSGS

    标题效果:给定一列数X(i+1)=(a*Xi+b)%p 最低要求i>0.所以Xi=t 0.0 这个问题可以1A那很棒 首先讨论特殊情况 如果X1=t ans=1 如果a=0 ans=b==t? ...

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

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

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

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

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

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

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

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

随机推荐

  1. OC开发_Storyboard——UITableView

    一.tableView 1.datasource数据源 (1 构造每一个tableVIewCell的方法:cellForRowAtIndexPath,这里的 dequeueReusableCellWi ...

  2. 微信小程序 --- model弹框

    model弹框:在屏幕中间弹出,让你进行选择: 效果: 代码: <button type="primary" bindtap="btnclick"> ...

  3. DFS判断正环

    hdu1217 Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. vue.js实现初了解(一)

    1. vue 2.0是用Flow做静态类型检查, 3.0对TypeScript的支持更好了: 2. vue.js是基于Rollup(更轻量,适合js库的构建)构建的,它的构建相关配置都在scripts ...

  5. 【JavaScript算法】---快速排序法

    一.快速排序法概念 我们将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边.比较完毕后再次取中间值,再次比 ...

  6. Tensorflow%20实战Google深度学习框架 4.2.2 自定义损失函数源代码

    import os import tab import tensorflow as tf from numpy.random import RandomState print "hello ...

  7. debug error 错误日志的调试模式

    https://docs.nginx.com/nginx/admin-guide/monitoring/logging/ error_log logs/error.log warn; In this ...

  8. flask中Flask()和Blueprint() flask中的g、add_url_rule、send_from_directory、static_url_path、static_folder的用法

    1.Blueprint()在蓝本注册函数register_blueprint()中,第一个参数为所注册的蓝本名称.当我们在应用对象上注册一个蓝图时,需要指定一个url_prefix关键字 参数(这个参 ...

  9. kubernetes实战(四):k8s持久化安装rabbitmq集群

    1.下载文件 https://github.com/dotbalo/k8s/ 2.创建namespace kubectl create namespace public-service 如果不使用pu ...

  10. orcle中如何使用动态游标来对变量进行赋值

    在oracle中动态游标的概念一般不常用,但有时根据客户的特殊业务,需要使用到动态游标来解决问题!在对于一条动态SQL语句而产生多条记录时,动态游标的使用将是一个很好的选择,具体参见如下在工作流项目中 ...