bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
Description
.jpg)
Input
输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数。
接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据。保证X1和t都是合法的页码。
注意:P一定为质数
Output
共T行,每行一个整数表示他最早读到第t页是哪一天。如果他永远不会读到第t页,输出-1。
Sample Input
7 1 1 3 3
7 2 2 2 0
7 2 2 2 1
Sample Output
3
-1
HINT
0<=a<=P-1,0<=b<=P-1,2<=P<=10^9
【思路】
逆元,BSGS算法
首先特判:a=0,a=1,当a=1时,序列为:
x1,x1+b,x1+2*b
…
即(x1+(n-1)*b) mod p=t,用个乘法逆元可以求出,当逆元为0的时候无解输出-1。
当a>=2时
可以得到通项公式:
xn=[
a^n-1 *(x1+b/(a-1))-b/(a-1) ] mod p
若满足xn=t,则有
a^n-1 = (b* (a-1)^-1 +t) * (b*(a-1)^-1+x1)^-1
mod p
于是可以用BSGS算法求n-1。
需要注意的是各种取模p一定要有。
【代码】
#include<map>
#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std; typedef long long LL;
const int N = 1e4+; LL pow(LL x,LL p,LL MOD) {
LL ans=;
while(p) {
if(p&) ans=(ans*x)%MOD;
x=(x*x)%MOD;
p>>=;
}
return ans;
}
map<LL,int> mp;
LL BSGS(LL a,LL b,LL MOD) {
a%=MOD;
int m=sqrt(MOD)+; mp.clear();
LL am=pow(pow(a,m,MOD),MOD-,MOD);
LL x=; mp[]=;
for(int i=;i<m;i++) {
x=(x*a)%MOD;
if(!mp.count(x)) mp[x]=i;
}
for(int i=;i<m;i++) {
if(mp.count(b)) return i*m+mp[b];
b=(b*am)%MOD;
}
return -;
} LL p,a,b,x1,t; int main() {
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
int T;
scanf("%d",&T);
while(T--) {
cin>>p>>a>>b>>x1>>t;
LL c=pow(a-,p-,p),d,x,y,con,inv;
if(x1==t) puts(""); else
if(!a) {
if(t==b) puts("");
else puts("-1");
} else
if(a==) {
inv=pow(b,p-,p);
if(!inv) puts("-1");
else printf("%lld\n",((inv*(t-x1+p)%p)+p)%p+);
} else {
con=((((b*c+t)%p)*(pow((x1+b*c)%p,p-,p)))%p+p)%p;
printf("%lld\n",BSGS(a,con,p)+);
}
}
return ;
}
bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)的更多相关文章
- bzoj 3122: [Sdoi2013]随机数生成器【BSGS】
题目要求的是: \[ ...a(a(a(ax+b)+b)+b)+b...=a^nx+a^{n-1}b+a^{n-2}b+...+b\equiv t(mod\ p) \] 后面这一大坨看着不舒服,所以考 ...
- 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]随机数生成器
#include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...
- 【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\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...
- [Sdoi2013]随机数生成器(BSGS)
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...
- 洛谷P3306 [SDOI2013]随机数生成器(BSGS)
传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...
- BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】
题目 输入格式 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 输出 ...
随机推荐
- 团体程序设计天梯赛-练习集L2-001. 紧急救援(dijkstra)
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
- hdu 4101
比赛的时候先是受以前一个圣神海的题目 用了两遍DFS 第一遍标记出围墙 第二遍求围墙外和每块围墙降为1所需的攻击次数 结果爆栈 改为BFS后AC DFS的加了一句这个 #pragma comme ...
- Avro RPC 之 Protocol 定义和代码生成
摘自http://avro.apache.org/docs/current/spec.html#Protocol+Declaration,1.7.6版 Protocol Declaration Avr ...
- 如何优化 Java 性能?
对于 Java 性能比较关心的同学大概都知道<Java Performance>这本书,一般而言,很多同学在日常写 Java Code 的时候很少去关心性能问题,但是在我们写 Code 的 ...
- setjump 和 longjump
goto语句可以用于同一个函数内异常处理,不幸的是,goto是本地的,它只能跳到所在函数内部的标号上.为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和 ...
- linux ubuntu关于U盘的安装 开机启动u盘的时候出现/casper/vmlinuz.efi: file not found
将u盘下的/casper/vmlinuz文件添加一个后缀.efi即可. 重启再装.
- 多线程 (四)GCD
学习GCD要掌握几个概念 任务:需要执行的代码块可以看作一个任务 队列:把任务放到队列里,遵循先进先出的原则 队列又分为串行队列和并行队列 串行队列:顺序执行 并发队列:同时执行多个任务 同步:在当前 ...
- BZOJ 3747 POI2015 Kinoman
因为上午没有准备够题目,结果发现写完这道题没题可写了QAQ 又因为这道题范围是100w,我写了发线段树,以为要T,上午就花了一个小时拼命卡常数 结果下午一交居然过了QAQ 我们考虑枚举L,求最大R使得 ...
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】08-基本运算
计算机的基本能力就是计算,所以一门程序设计语言的计算能力是非常重要的.C语言之所以无所不能,是因为它不仅有丰富的数据类型,还有强大的计算能力.C语言一共有34种运算符,包括了常见的加减乘除运算.这讲就 ...
- vimrc for windows
set nobackupsource $VIMRUNTIME/vimrc_example.vimsource $VIMRUNTIME/mswin.vimbehave mswin:color deser ...