BZOJ3122 随机数生成器——BSGS
2024-09-05 04:58:01
题意
给定 $p,\ a,\ b, \ x_1$,现有一数列
$$x_{i+1} \equiv (ax_i + b) \ mod \ p$$
求最小的 $i$ 满足 $x_i = t$
分析
代码
#include<bits/stdc++.h>
using namespace std; typedef long long ll; //ax + by = d,且|x|+|y|最小,其中d=gcd(a,b)
//即使a, b在int范围内,x和y也有可能超过int范围
void exgcd(ll a, ll b, ll &d, ll &x, ll &y)
{
if (!b){ d = a; x = ; y = ;}
else{ exgcd(b, a % b, d, y, x); y -= x * (a / b);}
} //计算模n下a的逆。如果不存在逆,返回-1
//ax=1(mod n)
ll inv(ll a, ll n)
{
ll d, x, y;
exgcd(a, n, d, x, y);
return d == ? (x + n) % n : -;
} inline ll bsgs(ll a, ll b, ll p) {
a %= p;
b %= p;
std::map<ll, ll> map;
ll m = ceil(sqrt(p)), t = ;
for (int i = ; i < m; i++) {
if (!map.count(t)) map[t] = i;
t = t * a % p;
} ll k = inv(t, p), w = b;
for (int i = ; i < m; i++) {
if (map.count(w)) return i * m + map[w];
w = w * k % p;
} return -;
} inline ll solve(ll p, ll a, ll b, ll x1, ll t) {
if (t == x1) return ;
else if (a == ) return b == t ? : -;
else if (a == ) {
if (!b) return -;
return ((((t - x1) % p + p) % p) * inv(b, p) % p) + ;
} else {
ll q = inv( - a + p, p);
ll d = (((t - b * q) % p + p) % p) * inv(((x1 - b * q) % p + p) % p, p);
ll ans = bsgs(a, d, p);
if (ans == -) return -;
else return ans + ;
}
} int main() {
int T;
scanf("%d", &T);
while (T--) {
int p, a, b, x1, t;
scanf("%d %d %d %d %d", &p, &a, &b, &x1, &t);
printf("%lld\n", solve(p, a, b, x1, t));
}
}
发现BZOJ还能下测试数据:https://darkbzoj.tk/data/
参考链接:https://oi.men.ci/sdoi2013-random/
最新文章
- Android安全攻防战,反编译与混淆技术完全解析(下)
- 企业架构(Enterprise Architecture)
- JS之setAttribute和getAttribute
- Spring Data Jpa配置
- Linux命令之chmod 及+s 参数(临时以所有者权限执行)
- 7个热门开源PHP框架
- 2013ACM-ICPC亚洲区南京站现场赛G题
- nginx使用自认证的https证书
- Spring IOC之基于注解的容器配置
- iOS混合应用开发入门
- asp.net中配置使用Sqlite轻型数据库
- tomcat启动端口号报错java.net.BindException: Cannot assign requested address
- vs2017中生成.Net Standard Libarary的Nuget Package
- 关于python,完善我计算机知识的一步。
- AXURE 8弄一个轮播图的步骤
- 正版phpstorm,webstorm,goland(Jetbrains系列都可以)免费激活步骤(图文详解)(亲测有效)
- LiveCharts文档-4基本绘图-2基本柱形图
- day5模块学习--re正则模块
- ABBYY FineReader Pro for Mac有哪些特性(上)
- python 常见报错汇总