BZOJ 3122 随机数生成器
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 随机数生成器的更多相关文章
- bzoj 3122 随机数生成器 - BSGS
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
- [BZOJ]3671 随机数生成器(Noi2014)
洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...
- 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* ...
- bzoj 3671 随机数生成器 —— 暴力
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 原来256M是可以开两个3e7的数组的: 因为答案只有 n+m-1 个数,所以暴力判断 ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- BZOJ 3122 【SDOI2013】 随机数生成器
题目链接:随机数生成器 经典数学题…… 为了方便接下来的处理,我们可以先把\(X_1=t\)的情况特判掉. 当\(a=0\)的时候显然只需再判一下\(b\)是否等于\(t\)即可. 当\(a=1\)的 ...
- 【BZOJ】【3671】【NOI2014】随机数生成器
贪心 嗯……其实生成这个矩阵就是一个$O(n^2)$的模拟 = = 然后?字典序最小?贪心呗= =能选1就选1,然后能选2就选2…… 我们发现,对于矩阵(1,1)~(n,m),假设1的位置是(x,y) ...
- BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )
矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...
- Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)
2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...
随机推荐
- hibernate.hbm.xml配置文件内容说明
下面是一个自动生成的配置文件: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PU ...
- Ⅳ.AngularJS的点点滴滴-- 服务
服务(Angularjs很多方法都是服务组成的) 1.使用service方法创建的单例服务 <html> <script src="http://ajax.googleap ...
- C++中各种数据量类型转换
要在Unicode字符集环境下把CString转化为char* 方法: CString str = _T("D://校内项目//QQ.bmp");//////leo这个NB 可以 ...
- iOS 关于开发者证书:此证书的签发者无效的解决方案
备注:第二个步骤一定要进行,否则弄到吐血,还是现实签发者无效 ---------------------- 1,按照你那个链接下载,https://developer.apple.com/certif ...
- Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- CSS自动控制图片大小的代码
img { max-width: 800px; height: auto; } 代码中的max-width:800px限制图片的最大宽度为800像素,而下面的hight:auto很关键,可以保证图片有 ...
- java的真相
所谓编译,就是把源代码“翻译”成目标代码——大多数是指机器代码——的过程.针对Java,它的目标代码不是本地机器代码,而是虚拟机代码. 编译原理里面有一个很重要的内容是编译器优化.所谓编译器优化是指, ...
- Java SE (1)之 JFrame 组件 BorderLayout 布局
JAVA 初期,练习SE ,桌面程序, package com.sunzhiyan; import java.awt.*; import java.awt.event.*; import javax. ...
- CI框架篇之类库篇--基础(1)
使用 CodeIgniter 类库: 所有的类库文件存放在system/libraries 文件夹.大多数情况下你需要预先在controller中初始化后才能使用它们: $this->load- ...
- 调用支付宝接口Android客户端没有支付宝APP的情况下解决无法调用支付宝页面的问题
这几天一直研究支付宝接口调用,因为当前应用中需要调用支付宝接口作移动支付. 遇到一个问题困扰几天,就是当我们的手机端未安装支付宝APP的时候,需要在自己应用中调用支付宝的登陆网页进行支付.我是Andr ...