Bzoj3122:多项式BSGS
根据鸽笼原理,在p次后一定循环,一眼BSGS。
发现他给的函数是个一次函数,一次函数有什么性质呢?f(f(x))还是一次函数,这样就能做了。
首先我们暴力预处理出f(f(f(x)))......sqrt(p)层的f(x)。
然后预处理出前sqrt(p)迭代后的值。
我们可以用exgcd求出如果让f(x)=t,我们需要的x值。
然后我们枚举用多少层迭代sqrt(p)后的f(x)即可。
注意特判一下a==0的情况,因为exgcd无法处理有0的参数。
为什么跑得如此之慢?可能我需要一个unordered_map,然而C++11不能用......
代码:
#include<cstdio>
#include<cmath>
#include<map>
typedef long long int lli;
using namespace std; lli mod; struct Poly {
lli k,b;
inline Poly inter(const Poly &t) {
return (Poly){t.k*k%mod,(t.b*k%mod+b)%mod};
}
inline lli ite(const lli &x) {
return ( k * x % mod + b ) % mod;
}
}now,trans,sqr; inline lli exgcd(lli a,lli b,lli &x,lli &y) {
if( !b ) {
x = , y = ;
return a;
}
lli ret = exgcd(b,a%b,y,x);
y -= ( a / b ) * x;
return ret;
} inline lli getx(const Poly &p,const lli &t) {
lli x,y,rit;
exgcd(p.k,mod,x,y);
rit = ( t - p.b + mod ) % mod , x = ( x % mod + mod ) % mod;
return x * rit % mod;
} inline lli bsgs(lli a,lli b,lli x,lli t) {
if( !a && !b ) return x == t ? : -;
map<lli,lli> mp;
int sq = ( (double) sqrt(mod) + 0.5 ) + ;
sqr = now = (Poly){,} , trans = (Poly){a,b};
for(int i=;i<=sq;i++) {
if( mp.find(x) == mp.end() ) mp[x] = i;
x = trans.ite(x);
}
for(int i=;i<=sq;i++) sqr = trans.inter(sqr);
for(int i=;i<=sq;i++) {
lli tx = getx(now,t);
if( mp.find(tx) != mp.end() ) return mp[tx] + i * sq;
now = sqr.inter(now);
}
return -;
} int main() {
static int T;
static lli a,b,x,t;
scanf("%d",&T);
while(T--) {
scanf("%lld%lld%lld%lld%lld",&mod,&a,&b,&x,&t);
printf("%lld\n",bsgs(a,b,x,t));
}
return ;
}
Bzoj3122:多项式BSGS的更多相关文章
- BSGS[bzoj2242][bzoj3122]
数论题. 操作一:直接快速幂就好了. 操作二:我用了exgcd,shy和lyz都喜欢欧拉函数...QAQ最后这块还写错了. 对于ax+by=gcd(a,b)的形式,我们可以把他们变成y'x+p'y=1 ...
- P5277 【模板】多项式开根(加强版)(bsgs or Cipolla)
题面 传送门 题解 首先你得会多项式开根->这里 其次你得会解形如 \[x^2\equiv a \pmod{p}\] 的方程 这里有两种方法,一个是\(bsgs\)(这里),还有一种是\(Cip ...
- 【BZOJ3122】随机数生成器(BSGS,数论)
[BZOJ3122]随机数生成器(BSGS,数论) 题面 BZOJ 洛谷 题解 考虑一下递推式 发现一定可以写成一个 \(X_{i+1}=(X_1+c)*a^i-c\)的形式 直接暴力解一下 \(X_ ...
- 【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: ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- 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 ...
随机推荐
- es7----proxy
proxy是代理的意思,es7新增这个可以代理某个变量的“增删改查”,vue的核心原理就是这个~~ 基本使用方法: let json = {a: 123, c: 999} let p = new Pr ...
- Git 配置环境及常用命令整理
一.Git教程网站 廖雪峰网站 易百GitHub命令:https://www.yiibai.com/git/git_clone.html 完成Windows环境命令下Git config配置 设置好之 ...
- python---django中orm的使用(4)字段,参数(on_delete重点)补充,一对多,一对一,多对多
1.索引: 普通索引:加快查找速度 唯一索引:加快查找速度,唯一约束 主键索引:加快查找速度,唯一索引,不为空 class UserInfo(models.Model): username = mod ...
- bzoj千题计划289:bzoj 2707: [SDOI2012]走迷宫
http://www.lydsy.com/JudgeOnline/problem.php?id=2707 dp[i] 表示从点i到终点的期望步数 dp[i]= Σ (dp[j]+1)/out[i] j ...
- html template--(来自网易)
html template 概述 包含完整头部信息和主体结构的HTML基础模板. 代码展示 <!DOCTYPE html> <html> <head> < ...
- [转载]HTML5 真的会消灭原生App吗?
http://mp.weixin.qq.com/s?__biz=MzA5NjQ4MzkyMw==&mid=201728945&idx=1&sn=8f43b5bb10695efc ...
- iOS 解决汉字联想输入,导致字数限制失效的问题
字数限制的问题点在于汉语可以无限汉语联想词汇,导致字数限制对于汉字输入就失去的作用.我们的做法是监听键盘联想出来的汉子,将其统计: 1 在viewDidLoad里面监听文本变化的通知 - (void) ...
- Javascript - 预编译与函数词法作用域
预编译与函数词法作用域(Precompiled & Scoped) 预编译 Javascript脚本的宿主在执行代码之前对脚本做了预编译处理,比如浏览器对Js进行了预编译,编译器会扫描所有的声 ...
- keepalived启动不成功,状态一直是inactive(dead) 的解决办法以及keepalived高版本没有rc.d目录,虚拟VIP无法访问问题
安装配置教程我就不说了,网上很多,这里只给出我遇到的两个坑: 1 rc.d目录 ,kp在1.4版本之后rc.d要去解压之后的源码包里去找,make之后的目录里面没有了,我使用的是2.0.13最新版本, ...
- Linux下内存泄漏工具【转】
转自:http://www.cnblogs.com/guochaoxxl/p/6970090.html 概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况 ...