[Sdoi2013]随机数生成器(BSGS)
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<iostream>
- #include<map>
- using namespace std;
- typedef long long ll;
- struct Thash{
- static const int MOD=;
- static const int MAXN=1e6+;
- int tot,head[MOD+],next[MAXN],h[MAXN],val[MAXN];
- inline void clear(){tot=;memset(head,,sizeof head);}
- inline void insert(int H,int VAL){
- for(int i=head[H%MOD];i;i=next[i]) if(h[i]==H){val[i]=VAL;return ;}
- next[++tot]=head[H%MOD];head[H%MOD]=tot;h[tot]=H;val[tot]=VAL;
- }
- inline int get(int H){
- for(int i=head[H%MOD];i;i=next[i]) if(h[i]==H) return val[i];
- return ;
- }
- }M;
- int T;
- ll p,a,b,x1,t;
- inline int read(){
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- ll fpow(ll a,ll p,ll mod){
- ll res=;
- for(;p;p>>=,a=a*a%mod) if(p&) res=res*a%mod;
- return res;
- }
- void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
- if(!b){d=a;x=;y=;return ;}
- exgcd(b,a%b,d,y,x);
- y-=x*(a/b);
- }
- ll BSGS(ll A,ll B,ll mod){
- A%=mod;
- if(!A){
- if(!B) return ;
- return -;
- }
- ll m=sqrt(mod)+,ni=fpow(A,mod-m-,mod);
- ll t=,y=;
- M.clear();
- M.insert(,m+);
- for(int i=;i<m;i++){
- t=t*A%mod;
- if(!M.get(t)) M.insert(t,i);
- }
- for(int i=;i<m;i++){
- int u=M.get(B*y%mod);
- if(u){
- if(u==m+) u=;
- return i*m+u;
- }
- y=y*ni%mod;
- }
- return -;
- }
- ll calc1(){
- ll z=(t-x1+p)%p,d,x,y;
- exgcd(b,p,d,x,y);
- if(z%d) return -;z/=d;
- x=x*z%p;
- if(x<) x+=p;
- return x+;
- }
- ll calc2(){
- ll c=fpow(a-,p-,p),A=(x1+b*c)%p,z=(b*c+t)%p,d,x,y;
- exgcd(A,p,d,x,y);
- if(z%d) return -;z/=d;
- if(x<p) x=x%p+p;
- d=BSGS(a,x*z%p,p);
- if(~d) return d+;
- return -;
- }
- ll solve(){
- if(x1==t) return ;
- if(!a){
- if(b==t) return ;
- else return -;
- }
- if(a==) return calc1();
- return calc2();
- }
- int main(){
- freopen("random.in","r",stdin);
- freopen("random.out","w",stdout);
- for(T=read();T--;){
- p=read();a=read();b=read();x1=read();t=read();
- printf("%lld\n",solve());
- }
- return ;
- }
[Sdoi2013]随机数生成器(BSGS)的更多相关文章
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...
- bzoj 3122 : [Sdoi2013]随机数生成器 BSGS
BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...
- 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用
题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...
- [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列
题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...
- Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- bzoj3122 [SDOI2013]随机数生成器
bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...
随机推荐
- OpenSessionInViewFilter的配置
OpenSessionInViewFilter是用来处理懒加载异常的. 懒加载异常的意思的就是:还用不到的东西,就先不加载,等需要的时候再来加载. 所以懒加载对性能有一定的提升,但是,这也会出现一些问 ...
- ASIHttpRequest请求时的默认编码
在ASIHttpRequest.m文件 中的 - (id)initWithURL:(NSURL *)newURL方法中找到 [self setDefaultResponseEncoding:NSISO ...
- MySQL5.7 基于二进制包的安装
1.MySQL5.7安装注意事项 1.在MySQL5.7中mysql_install_db已经不再推荐使用,建议改成mysqld-initialize 完成实力初始化.(mysql_install_d ...
- 线程阻塞工具类:LockSupport(读书笔记)
他可以在线程任意位置让线程阻塞, LockSupport的静态方法park()可以阻塞当前线程,类似的还有parkNanos() ParkUntil()等,他们实现了一个限时等待 public cl ...
- Laravel之Session
一.配置 Session 配置文件位于config/session.php .默认情况下,Laravel 使用的session 驱动为文件驱动,这对许多应用而言是没有什么问题的.在生产环境中,你可能考 ...
- Laravel之认证服务
一.用户认证 配置文件在config/auth.php下 1.添加认证路由 // 认证路由... Route::get('auth/login', 'Auth\AuthController@getLo ...
- STL学习笔记(第五章 STL组件)
STL组件 若干精心勾画的组件共同合作,构筑起STL的基础.这些组件最关键的是容器.迭代器和算法. 下图演示了STL组件之间的合作 容器(Containers) 容器类别(简称容器)用来管理一组元素. ...
- 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)
并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...
- javascript---》arguments对象
使用arguments可以直接访问函数传入的实参 如:arguments[0]访问第一个参数,arguments[1]访问第二个参数 arguments.length检测函数的参数个数 如: func ...
- R 包的安装,使用,更新
R包的使用方法 包就是提供了种类繁多的函数,当然还有它的一些数据集,可以使用这些函数来操作这些数据集,来学习使用. library(),当前的工作环境里,可以使用的包 包的帮助文档:help(pack ...