【[SDOI2013]随机数生成器】
来画柿子吧
我们要求的是
\]
其中\(f(1)=x_0,f(x)=af(x-1)+b\)
我们来写几项柿子看看
\]
\]
\]
\]
我们发现好像后面就是一个等比数列求和啊
于是我们甚至可以搞出一个通项来
于是
\]
显然后面那个东西就是\(\frac{a^{x-1}-1}{a-1}\)
所以
\]
干脆设\(k=x-1\)
\]
所以我们现在的方程是
\]
我们设
\]
所以现在变成了
\]
所以这不就是\(bsgs\)板子了吗,\(k+1\)就是答案了
注意特判掉\(a=1\)以及\(x_0=t\)的情况
代码
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<tr1/unordered_map>
#define re register
#define LL long long
using namespace std::tr1;
unordered_map<LL,LL> ma;
int T;
LL P,a,b,x0,t;
void exgcd(LL a,LL b,LL &x,LL &y) {if(!b) {x=1,y=0;return;} exgcd(b,a%b,y,x);y-=a/b*x;}
inline LL quick(LL a,LL b) {LL S=1;while(b) {if(b&1) S=S*a%P; b>>=1; a=a*a%P;} return S;}
inline void bsgs()
{
	if(x0==t) {puts("1");return;}
	if(a==0) {if(b==t) puts("2");else puts("-1"); return;}
	if(a==1&&!b) {puts("-1");return;}
	if(a==1&&b)
	{
		t=t-x0; t=(t%P+P)%P;
		LL x,y;
		exgcd(b,P,x,y); x=(x*t%P+P)%P;
		printf("%lld\n",x+1); return;
	}
	ma.clear();
	if(a%P==0) {puts("-1");return;}
	LL inv=(a*x0%P-x0+b)%P; inv=(inv+P)%P;
	LL x,y; exgcd(a-1,P,x,y); x=(x%P+P)%P; t=t+(b*x)%P; t%=P;inv=inv*x%P;
	exgcd(inv,P,x,y);
	x=(x%P+P)%P;
	t=t*x%P;
	LL now=1;
	LL m=ceil(std::sqrt(P+1));
	for(re int i=0;i<=m;i++) ma[now*t%P]=i,now=now*a%P;
	LL S=quick(a,m);now=S;
	for(re int i=1;i<=m;i++)
	{
		if(ma.find(now)!=ma.end())
		{LL ans=(LL)i*(LL)m-ma[now];printf("%lld\n",ans+1);return;}
		now=now*S%P;
	}
	puts("-1");
}
int main()
{
	scanf("%d",&T);
	while(T--) scanf("%lld%lld%lld%lld%lld",&P,&a,&b,&x0,&t),bsgs();
	return 0;
}
【[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}{ ... 
- bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器
		http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ... 
随机推荐
- Two Sum [easy] (Python)
			由于题目说了有且只有唯一解,可以考虑两遍扫描求解:第一遍扫描原数组,将所有的数重新存放到一个dict中,该dict以原数组中的值为键,原数组中的下标为值:第二遍扫描原数组,对于每个数nums[i]查看 ... 
- vue-vli3创建的项目配置热更新
			vue-vli3创建的项目配置热更新 问题描述:使用vue-cli3创建的项目,修改代码之后,浏览器页面不会自动刷新,然而之前使用webpack初始化的vue项目修改代码之后浏览器会重新加载一下,因为 ... 
- kafaka安装
			wget https://mirrors.cnnic.cn/apache/kafka/2.0.0/kafka_2.11-2.0.0.tgz 解压 Tar -xvf kafka_2.11-2.0.0.t ... 
- 理解 glibc malloc:主流用户态内存分配器实现原理
			https://blog.csdn.net/maokelong95/article/details/51989081 Understanding glibc malloc 修订日志: 2017-03- ... 
- TimesTen客户端DSN配置
			打开控制面板\管理工具 1.打开数据源(ODBC) 2.选择系统DSN 3.选择添加: 4.单击完成 5.Servers 
- java多态的具体表现实例和理解
			Java的多态性 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作 ... 
- 虚拟机vmware  上不去 连不上网问题解决
			开始---设置--控制面板---管理工具---服务 确保 VMware DHCP Service 和VMware NAT Service 服务已经启动 
- Eclipse error: “The import XXX cannot be resolved”
			解决 Eclipse error: “The import XXX cannot be resolved” eclipse中修改: 1. 项目-->Properties-->java bu ... 
- vs2012 使用方法汇总
			1)安装Vsiual Assist插件 工具栏-->tools-->Extentsions and Upates-->点击左边的Online然后右边会出现可以安装的插件,找到Visu ... 
- 【Shell】按行读取文件内容
			方法1:while循环中执行效率最高,最常用的方法. function while_read_LINE_bottm(){ While read LINE do echo $LINE done < ... 
