题目链接:随机数生成器

  经典数学题……

  为了方便接下来的处理,我们可以先把\(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. highmaps如何自定义 区间的颜色刻度

    https://api.highcharts.com/highmaps/colorAxis.dataClassColor http://jsfiddle.net/gh/get/library/pure ...

  2. java类的成员初始化顺序和初始化块知识

    java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...

  3. javaWeb中的文件上传下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  4. (转)梯度下降法及其Python实现

    梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前 ...

  5. SaltStack生产案例-系统初始化

    需求分析 一,系统初始化 1.1  关闭SELinux 1.2  关闭默认iptables 1.3  时间同步(配置NTP)  1.4  文件描述符(必备/etc/security/limmits.c ...

  6. BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。面向切面 将声明性事务管理集成到应用程序中

    Spring 系列: Spring 框架简介 https://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring 框架简介 Spring AOP ...

  7. AJAX.basic

    之前在项目中使用ajax都是通过jQuery的Ajax API来进行的,今天试了一下通过基本的JavaScript来进行ajax请求,将代码记录下来: jsp 页面 <%@ page pageE ...

  8. RGBA HSB opengl光照模型

    RGBA HSB   HSV颜色模型对应于画家的配色的方法.画家用改变色浓和色深的方法来从某种纯色获得不同色调的颜色.其做法是:在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白 ...

  9. Django - 项目总结

    总结: 基础,进阶,项目 Django - 练习(图书管理系统) 前后端分离得项目: vue + rest framework 项目: 图书增删改查页面 BBS + BLOG系统 CRM系统   在线 ...

  10. django的request对象和response对象

    概述Django 使用 request 和 response 对象表示系统状态数据..当请求一个页面时,Django创建一个 HttpRequest 对象.该对象包含 request 的元数据. 然后 ...