luoguP3306 [SDOI2013]随机数生成器
将\(x_1,x_2,x_3...x_n\)写出来可以发现通项为\(a^{i-1}*x_1+b*\sum\limits_{j=0}^{i-2}a^j=a^{i-1}*x_1+b*\frac{1-a^{i-1}}{1-a}=(x_1-\frac{b}{1-a})a^{i-1}+\frac{b}{1-a}\)
所求变为求一个\(i\)满足:
\(t\equiv (x_1-\frac{b}{1-a})a^{i-1}+\frac{b}{1-a}\pmod{p}\)
\(a^{i-1}\equiv \frac{t-(\frac{b}{1-a})}{x_1-\frac{b}{1-a}}\pmod{p}\)
上BSGS即可,注意特判\(a=0/1\)。
\(a=0\):对于任意\(i,x_i=b\)
\(a=1\):\(x_i=x_1+(i-1)*b\)
解下对应的方程即可。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
ll a,b,x1,mod,goal;
inline ll power(ll x,ll k,ll mod)
{
ll res=1;
while(k)
{
if(k&1)res=res*x%mod;
x=x*x%mod;k>>=1;
}
return res;
}
inline ll inv(ll x,ll mod){return power(x,mod-2,mod);}
inline ll BSGS(ll a,ll b,ll mod)
{
if(b==1)return 0;
unordered_map<ll,int>mp;mp.clear();
a%=mod,b%=mod;
ll t=ceil(sqrt(mod));
ll now=1;
for(int i=0;i<=t;i++)mp[b*now%mod]=i,now=now*a%mod;
a=power(a,t,mod);
if(!a)return !b?1:-1;
now=a;
for(int i=1;i<=t;i++)
{
if(mp.count(now))return i*t-mp[now];
now=now*a%mod;
}
return -1;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld%lld%lld",&mod,&a,&b,&x1,&goal);
if(x1==goal){puts("1");continue;}
if(!a){puts(b==goal?"2":"-1");continue;}
if(a==1)
{
goal=((goal-x1)%mod+mod)%mod;
ll d=__gcd(b,mod);
if(goal%d){puts("-1");continue;}
ll res=(goal*inv(b,mod)+1)%mod;
if(!res)res=mod;
printf("%lld\n",res);
continue;
}
ll res=BSGS(a,((goal-b*inv(1-a,mod)%mod)%mod+mod)%mod*inv(((x1-b*inv(1-a,mod)%mod)%mod+mod)%mod,mod)%mod,mod);
printf("%lld\n",res==-1?res:res+1);
}
return 0;
}
luoguP3306 [SDOI2013]随机数生成器的更多相关文章
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- bzoj3122 [SDOI2013]随机数生成器
bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)
题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...
- bzoj 3122: [Sdoi2013]随机数生成器
#include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...
- bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
- BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...
随机推荐
- Java成员变量和局部变量区别
成员变量和局部变量区别 变量根据定义位置的不同,我们给变量起了不同的名字.如下图所示: 区别 在类中的位置不同 (重点) 成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数) 作用范围 ...
- 什么是CSS?它的特点有哪些?
css 中文名称:层叠样式表,也称级联样式表 英文名称:Cascading Style Sheets 最新的版本:css3 1.层叠性 在权重(优先级)相同的情况下,同一个标签的样式发生冲突, 最后定 ...
- wepy安装后提示Cannot read property 'addDeps'
最近准备做一个微信小程序,以前一直用的小程序原始api做,但是这次准备用一个框架来做练习,当然在做之前需要比较一下现在小程序框架的优缺点. 经过认真挑选,选定wepy,Taro,uni-app,mpv ...
- Sql ----- sqlserver 中的if 判断 case... when
与查询放到一块使用: 语法: select case when 范围条件 then 产生的结果 when 范围条件 then 产生的结果 else 不是以上范围产生的结果 end from 表名 个人 ...
- 模型可视化工具netron
https://github.com/lutzroeder/Netron 支持各种格式的模型 caffe模型实测效果: 右侧可以看到卷积核的具体的值.
- HashMap框架源码深入解读,面试不用愁
在Java Collections Framework的体系中中,主要有两个重要的接口,一个是List.Set和Queue所属的Collection,还有一个就是Map接口了.在上一篇文章中介绍了Li ...
- Go文件内容追加问题
今天在用文件追加时,遇到点小问题,一直没法追加,起初是这样的 fp,err1 = os.OpenFile(filename,os.O_APPEND,0666) 上面这个死活加不了,后面改成 fp,er ...
- java主函数
相信很多初次接触java的同学,在遇见主函数的时候,听到最多的就是主函数的格式是固定的,不能进行修改等等.这就让人疑惑了,主函数为啥就那么特殊呢?接下来博主会为大家解释主函数.大家先看看下面这个程序: ...
- .NET MVC5简介(一)
就像是.NET Framework WebApi与.NET Core WebApi一样,.NET Framework MVC与.NET Core MVC的区别,也是框架的之间的区别.本系列先首先从.N ...
- [转]Eclipse插件开发之基础篇(1) 插件开发的基础知识
原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/13/eclipse_plugin_1_0_2.html 名词翻译 有一些名词在翻译的过程中可能 ...