题目链接:随机数生成器

  经典数学题……

  为了方便接下来的处理,我们可以先把\(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. elk日志分析与发掘深入分析

    elk日志分析与挖掘深入分析 1 为什么要做日志采集? 2 挖财自己的日志采集和分析体系应该怎么建? 2.1 日志的采集 2.2 日志的汇总与过滤 2.3 日志的存储 2.4 日志的分析与查询 3 需 ...

  2. IDEA Tomcat部署时war和war exploded区别以及平时踩得坑

    war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别: war模式 ...

  3. 封装自己的getClassName函数

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. CodeForeces 25E (kmp)

    E. Test time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputst ...

  5. php curl采集数据问题汇总

    1. 使用curl获取网页数据提示: "curl: (6) Could not resolve host: xxx.xxx.com ; Name or service not known&q ...

  6. UML Diagrams Using Graphviz Dot

    Introduction Background This article is about using the dot tool from the Graphviz package to automa ...

  7. Flask知识总汇

    Flask基础 Flask基础使用与配置 Flask路由系统与模板系统 Flask视图函数 Flask请求与响应 Flask的session操作 Flask中间件 Flask连接数据库 Flask使用 ...

  8. 将expression转化为数据类型int时发生算术溢出错误

    在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...

  9. Mac Atom的PHP插件

    首先,需要在 ~/.atom目录下创建 .atom文件,写入如下内容: strict-ssl = false http_proxy = socks5://127.0.0.1:16888 https_p ...

  10. 【mybatis】认识selectKey

    转:https://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html 对于不支持自动生成类型的数据库或可能不支持自动生成主键 JDBC 驱动来说,MyBat ...