【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)
怎么这么多随机数生成器
题意见原题。
很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列。
但是可以用矩阵乘法来求出第\(i\)项,所以好像可以用\(BSGS\)套矩阵乘法?但是总要把那个常数项除过来吧,矩阵除法是什么鬼?
无奈只好放弃去看题解。
看完之后,哎,我太蒻了。
\]
\]
\]
\]
\]
\]
然后,你发现了什么?
没错,式子两边都有一个\(X+\frac{b}{a-1}\)。
把上面这个式子的左边再乘一个\(a\)就能得到\(X_{i+2}+\frac{b}{a-1}\)。
于是就有
\]
\]
左边的都是已知的,对左边有理数取余,然后就可以\(BSGS\)了,不会\(BSGS\)的戳这里。
另外对\(a=0,1\)或者\(X_1=t\)要特判一下
#include <cstdio>
#include <map>
#include <cmath>
#include <cstdlib>
#define ll long long
using namespace std;
int fast_pow(int n, int k, int p){ //n^k%p
int ans = 1;
while(k){
if(k & 1) ans = (long long)ans * n % p;
n = (long long)n * n % p;
k >>= 1;
}
return ans;
}
int BSGS(int a, int b, int p){ //a^x≡b(mod p)
map <int, int> hash; hash.clear();
int t = ceil(sqrt(p));
for(int i = 0; i < t; ++i){
int val = (long long)b * fast_pow(a, i, p) % p;
hash[val] = i;
}
a = fast_pow(a, t, p);
if(!a) return !b ? 1 : -1;
for(int i = 0; i <= t; ++i){
int j = fast_pow(a, i, p);
int k = hash.find(j) == hash.end() ? -1 : hash[j];
if(k >= 0 && (i * t - k) >= 0) return i * t - k;
}
return -1;
}
void exgcd(int a, int b, int &x, int &y){
if(!b){
x = 1; y = 0;
return;
}
exgcd(b, a % b, x, y);
int z = x; x = y; y = z - (a / b) * y;
}
int T;
int p, a, b, x, t;
int X, Y;
int main(){
scanf("%d", &T);
while(T--){
scanf("%d%d%d%d%d", &p, &a, &b, &x, &t);
if(x == t) { printf("1\n"); continue; }
if(!a){
if(t == b) printf("2\n");
else printf("-1\n");
continue;
}
if(a == 1 && !b) { printf("-1\n"); continue; }
if(a == 1){
int r = fast_pow(b, p - 2, p);
printf("%d\n",(((((long long)t - x) % p + p) % p) * r % p) % p + 1);
continue;
}
int u = fast_pow(a - 1, p - 2, p);
u = (long long)b * ((u % p + p) % p) %p;
exgcd((x + u) % p, p, X, Y);
X = (long long)(t + u) * ((X % p + p) % p) % p;
int ans = BSGS(a, X, p);
printf("%d\n", ~ans ? ans + 1 : ans);
}
return 0;
}
【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)的更多相关文章
- 洛谷P3306 [SDOI2013]随机数生成器(BSGS)
传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
- 【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, ...
- P3306 [SDOI2013]随机数生成器(bzoj3122)
洛谷 bzoj 特判+多测真恶心 . \(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\) Sample Input 3 7 1 1 3 3 7 2 2 2 0 ...
- 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 ...
随机推荐
- Spring研磨分析、Quartz任务调度、Hibernate深入浅出系列文章笔记汇总
Spring研磨分析.Quartz任务调度.Hibernate深入浅出系列文章笔记汇总 置顶2017年04月27日 10:46:45 阅读数:1213 这系列文章主要是对Spring.Quartz.H ...
- Bootstrap开发漂亮的前端界面之实现原理
引:Bootstrap采用的是一个“响应式”设计.响应式Web 设计是一个让用户通过各种尺寸的设备浏览网站获得良好的视觉效果的方法.例如,您先在计算机显示器上浏览一个网站,然后再智能手机上浏览,智能手 ...
- ACE Reactor 源码解析
http://blogs.readthedocs.org/ ACE的学习笔记,根据源码分析了Reactor模型的实现. 因为笔记编写技术限制,这里仅列出主要目录,如有可能可以抽空复制到该Blog中 ...
- cf#513 B. Maximum Sum of Digits
B. Maximum Sum of Digits time limit per test 2 seconds memory limit per test 512 megabytes input sta ...
- 杀死 tomcat 进程的脚本
新建一个.sh 文件 把下面的内容复制进去.然后 把这个文件放到tomcat 的bin目录下在关闭tomcat 执行这个脚本. 可以解决 在关闭tomcat的时候 总是遗留一些tomcat进程没有结束 ...
- BZOJ1270[BJWC2008]雷涛的小猫
雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的).在他的照顾下,小猫很快恢复了健康,并且愈发的活泼可爱了. 可是有一天,雷涛下课回到寝室,却 ...
- Python全栈 MongoDB 数据库(数据的查找)
非关系型数据库和关系型数据库的区别? 不是以关系模型构建的,结构自由 非关系型数据库不保证数据一致性 非关系型数据库可以在处理高并发和海量数据时弥补关系数据库的不足 非关系型数据库在技术上没有关系 ...
- Leetcode 684.冗余连接
冗余连接 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间,这条 ...
- 如何使用remix
---恢复内容开始--- 教程 | [Ethereum 智能合约开发笔记]使用 Remix Ajian | 3. Feb, 2018 | 621 次阅读 教程 Remix 开发工具 之前有自己开发过E ...
- CCS Font 知识整理总结
总是搞不懂 CCS 中如何正确的使用字体,这下明白了. 1.什么是 font-face font-face 顾名思义,就是文字的脸.字体是文字的外在形式,就是文字的风格,是文字的外衣.比如行书.楷书. ...