http://www.lydsy.com/JudgeOnline/problem.php?id=3122

题意:给出p,a,b,x1,t

已知xn=a*xn-1+b%p,求最小的n令xn=t

首先,若x1=t,则返回1

若a=0,则若b=t 返回2,否则无解

若a=1,则T=t-x1+p%p,可以列出方程

b*x+p*y==T % p

若a>=2,则根据等比数列和可得

xn=t=x1*a^(n-1)+b*(a^(n-1)-1)/(a-1) %p

由于p为质数,所以令c=inv[a-1]=(a-1)^(p-2)

x1*a^(n-1)+b*c*(a^(n-1))==b*c+t %p

(x1+b*c)*(a^(n-1))==b*c+t % p

令A=x1+b*c,B=p,C=b*c+t

则就是解A*X+B*Y==C %p

解出来X=a^(n-1),然后这个用BSGS求就可以了

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<map>
#define ll long long
ll p;
ll read(){
char ch=getchar();ll t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
ll Pow(ll x,ll y){
ll res=;
if (x<) x=(x+p)%p;
while (y){
if (y%) res=(res*x)%p;
x=(x*x)%p;
y/=;
}
return res;
}
ll gcd(ll a,ll b){
if (b==) return a;
else return gcd(b,a%b);
}
void exgcd(ll a,ll b,ll &x,ll &y){
if (b==){
x=;
y=;
return;
}
exgcd(b,a%b,x,y);
ll T=x;
x=y;
y=T-(a/b)*y;
}
ll reverse(ll X){
ll A=X,B=p;
ll x,y;
exgcd(A,B,x,y);
return (x%p+p)%p;
}
ll work(ll a,ll b){
a%=p;
if (a==){
if (b==) return ;
else return -;
}
std::map<ll,int> mp;
ll m=sqrt(p)+,I=,Im=Pow(a,p--m),t=;
mp.clear();mp[]=m+;
for (int i=;i<m;i++){
t=t*a%p;
if (!mp[t]) mp[t]=i;
}
for (int k=;k<m;k++){
int i=mp[I*b%p];
if (i){
if (i==m+) i=;
return i+k*m;
}
I=I*Im%p;
}
return -;
}
ll solve(ll a,ll b,ll x1,ll t){
if (t==x1) {
return ;
}
if (a==){
if (b==t){
return ;
}
return -;
}
if (a==){
ll A=b,B=p,T=(t-x1+p)%p;
ll D=gcd(A,B);
if (T%D) {
return -;
}
T/=D;
ll x,y;
exgcd(A,B,x,y);
x=(x*T)%p;
while (x<) x+=p;
return x+;
}
ll c=Pow(a-,p-);
ll A=(b*c+x1)%p,B=p,T=(b*c+t)%p;
if (A<) A=(A+p)%p;
if (B<) B=(B+p)%p;
ll D=gcd(A,B);
if (T%D){
return -;
}
T/=D;
ll x,y;
exgcd(A,B,x,y);
while (x<) x=(x+p)%p;
x=(x*T)%p;
ll ans=work(a,x);
if (ans!=-) return ans+;
else return ans;
}
int main(){
int Tcase;
scanf("%d",&Tcase);
while (Tcase--){
ll a,b,x1,t;
p=read();a=read();b=read();x1=read();t=read();
printf("%lld\n",solve(a,b,x1,t));
}
}

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

  1. bzoj 3122 随机数生成器 - BSGS

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

  2. [BZOJ]3671 随机数生成器(Noi2014)

    洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...

  3. BZOJ 2875 随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=2875 题意:给出mod,a,c,g,x0,n,xn=(a*xn-1+c)%mod,求xn%g 求A* ...

  4. bzoj 3671 随机数生成器 —— 暴力

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 原来256M是可以开两个3e7的数组的: 因为答案只有 n+m-1 个数,所以暴力判断 ...

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

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

  6. BZOJ 3122 【SDOI2013】 随机数生成器

    题目链接:随机数生成器 经典数学题…… 为了方便接下来的处理,我们可以先把\(X_1=t\)的情况特判掉. 当\(a=0\)的时候显然只需再判一下\(b\)是否等于\(t\)即可. 当\(a=1\)的 ...

  7. 【BZOJ】【3671】【NOI2014】随机数生成器

    贪心 嗯……其实生成这个矩阵就是一个$O(n^2)$的模拟 = = 然后?字典序最小?贪心呗= =能选1就选1,然后能选2就选2…… 我们发现,对于矩阵(1,1)~(n,m),假设1的位置是(x,y) ...

  8. BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

    矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...

  9. Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)

    2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...

随机推荐

  1. A Cross-Platform Memory Leak Detector

    Memory leakage has been a permanent annoyance for C/C++ programmers. Under MSVC, one useful feature ...

  2. java转义xml中的多余尖括号

    xml中的敏感字符是尖括号,如果xml的值中含有尖括号,那么在解析的时候就会报错,如: <?xml version="1.0" encoding="UTF-8&qu ...

  3. System Operations on AWS - Lab 3W - Managing Storage (Windows)

    创建一个名叫Processor的EC2实例,登陆到CommandHost实例,通过AWS CLI对Processor实例的EBS卷做snapshot,设置周期性snapshot的计划任务, 登陆到Pr ...

  4. Linux Bash算数运算方法小结

    A= B= 方法1:let(中间无空格) let C=$A+$B 方法2:$[  ] C=$[$A+$B] 方法3:$(()) C=$(($A+$B)) 方法4:expr(中间有空格) C=`expr ...

  5. python: pandas模块

    10分钟入门 pandas 评:我跟作者的智商差距是有多大,才能让我用60分钟看完作者认为10分钟的内容... 详细内容见 Cookbook 习惯上我们先导入 : In [1]: import pan ...

  6. 逻辑回归应用之Kaggle泰坦尼克之灾(转)

    正文:14pt 代码:15px 1 初探数据 先看看我们的数据,长什么样吧.在Data下我们train.csv和test.csv两个文件,分别存着官方给的训练和测试数据. import pandas ...

  7. IE6 中的最大最小寬度和高度 css 高度 控制(兼容版本)

    /* 最小寬度 */.min_width{min-width:300px; /* sets max-width for IE */ _width:expression(document.body.cl ...

  8. 安装mysql数据库

    http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html

  9. mac下使用自带的apache与php

    启动apache 运行命令 sudo  apachectl -k start 启动apache 如果报 AH00526: Syntax error on line 20 of /private/etc ...

  10. GitHub中"watch" "star" "fork"三个按钮干什么用的?

    总结下一般使用:1.想拷贝别人项目到自己帐号下就fork一下.2.持续关注别人项目更新就star一下3.watch是设置接收邮件提醒的.具体提醒有Issues and their commentsPu ...