bzoj 3122: [Sdoi2013]随机数生成器【BSGS】
题目要求的是:
\]
后面这一大坨看着不舒服,所以考虑把它化掉,这里有两种做法:
做法一:两边同乘a-1
\]
\]
\]
\]
\]
注意这个很容易乘爆,记得随时取模
做法二:后面乘上a-1的逆元
\]
\]
\]
\]
\]
然后用BSGS解即可,记得加一
#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
using namespace std;
long long T,p,a,b,x,t,y,z;
map<long long,long long>mp;
long long ksm(long long a,long long b)
{
	long long r=1ll;
	a%=p;
	while(b)
	{
		if(b&1)
			r=r*a%p;
		a=a*a%p;
		b>>=1;
	}
	return r;
}
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x,&t);
		if(x==t)
		{
			puts("1");
			continue;
		}
		if(a==0)
		{
			if(b==t)
				puts("2");
			else
				puts("-1");
			continue;
		}
		if(a==1&&b==0)
		{
			puts("-1");
			continue;
		}
		if(a==1)
		{
			long long now=ksm(b,p-2);
			printf("%lld\n",(((t-x)%p+p)%p*now%p+p)%p+1);
			continue;
		}
		y=a,z=((a*t%p-t+b)%p*ksm(a*x-x+b,p-2)%p+p)%p;
		//y=a,z=((t+b*ksm(a-1,p-2)%p)%p*ksm((x%p+b*ksm(a-1,p-2)%p)%p,p-2))%p;//(a*t-t+b)*ksm(a*x-x+b,p-2);做法二
		y%=p;
		if(!y&&!z)
		{
			puts("1");
			continue;
		}
		if(!y)
		{
			puts("-1");
			continue;
		}
		mp.clear();
		long long m=ceil(sqrt(p)),t=1;
		mp[1]=m+1;
		for(long long i=1;i<m;i++)
		{
			t=t*y%p;
			if(!mp[t])
				mp[t]=i;
		}
		long long tmp=ksm(y,p-m-1),now=1,f=0;
		for(long long k=0;k<m;k++)
		{
			long long i=mp[z*now%p];
			if(i)
			{
				if(i==m+1)
					i=0;
				printf("%lld\n",k*m+i+1);
				f=1;
				break;
			}
			now=now*tmp%p;
		}
		if(!f)
			puts("-1");
	}
	return 0;
}
												
											bzoj 3122: [Sdoi2013]随机数生成器【BSGS】的更多相关文章
- bzoj 3122 : [Sdoi2013]随机数生成器 BSGS
		
BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...
 - Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
		
Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...
 - bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
		
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
 - bzoj 3122: [Sdoi2013]随机数生成器
		
#include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...
 - 【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}{ ...
 - 【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 ...
 
随机推荐
- iOS - 系统方法中弃用的关键字的了解 NS_AVAILABLE和NS_DEPRECATED
			
NS_AVAILABLE_IOS(5_0) 这个方法可以在iOS5.0及以后的版本中使用,如果在比5.0更老的版本中调用这个方法,就会引起崩溃. NS_AVAILABLE(_mac, _ios) ...
 - how-do-i-access-windows-event-viewer-log-data-from-java
			
https://stackoverflow.com/questions/310355/how-do-i-access-windows-event-viewer-log-data-from-java
 - Codeforces 658C Bear and Forgotten Tree 3【构造】
			
题目链接: http://codeforces.com/contest/658/problem/C 题意: 给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边 ...
 - 设置select的默认选项
			
2014-01-07 09:54:34| 通过后台传出的值进行选择默认项的设置 <select name="user_id" id="user_id" ...
 - xml建模
			
1.建模的由来 就是将指定的xml字符串当作对象来操作 如果说当对一个指定的xml格式字符串完成了建模操作, 好处在于,只需要调用指定的方法就可以完成预定的字符串获取: 2.建模的思路 1.分析需要被 ...
 - CPU 天梯图
 - 国内代码托管平台(Git和SVN)
			
Github(Git和SVN)https://github.com/ 可以说GitHub的出现完全颠覆了以往大家对代码托管网站的认识.GitHub不但是一个代码托管网站,更是一个程序员的SNS ...
 - 元数据的概念以及相关的操作os模块、shutil模块
			
查看文件的元数据 stat [OPTION]… FILE… OPTION: -f 输出文件系统的状态,而非文件的状态 -t 显示简要格式的文件元数据信息 FILE:可同时查看多个文件的元数据信息,多个 ...
 - 使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结
			
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/48318877 本文出自[我是干勾鱼的博客] 1 简单介绍 MySQL Workb ...
 - Office PDF如何批量删除书签
			
网上下了本PDF,不知道哪个傻逼每一页都做了一个书签,我真的想做个书签,看看自己做到哪一页都被搞乱了.狗日的,还没有批量删除功能. 方法就是,你定位到任意一个书签,然后按住Delete键,然后就可 ...