bzoj3122 [SDOI2013]随机数生成器

给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\)

求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\)

\(0\leq a,\ b,\ t,\ P\leq10^9,\ P\) 为质数

BSGS


首先化式子,推得

\[X_k=a^{k-1}x+b\displaystyle\sum_{i=0}^{k-2}a_i
\]

因此

\[\begin{aligned}\displaystyle\sum_{i=0}^{k-2}a_i&\equiv\frac{t-a^{k-1}x}{b}\pmod P\\\frac{a^{k-1}-1}{a-1}&\equiv\frac{t-a^{k-1}x}{b}\pmod P\\a^{k-1}(b-x+ax)&\equiv at-t+b\pmod P\\a^{k-1}&\equiv\frac{at-t+b}{b-x+ax}\pmod P\end{aligned}
\]

所以上 \(BSGS\)

然而这题特判很恶心,不加特判 \(0\text{pts}\)

特判如下:

  • \(x=t:ans=1\)
  • \(a=1\)
    • \(b=0:ans=-1\)
    • \(b\neq0:ans=\frac{t-x}{b}+1\)
  • \(a=0\)
    • \(b=t:ans=2\)
    • \(b\neq t:ans=-1\)

时间复杂度 \(O(T\sqrt P)\)

代码

#include <bits/stdc++.h>
using namespace std; int P; int qp(int a, int k) {
int res = bool(a);
for (; k; k >>= 1, a = 1ll * a * a % P) {
if (k & 1) res = 1ll * res * a % P;
}
return res % P;
} int bsgs(int a, int b) {
if (!a && b) return -1;
map <int, int> s;
int sz = sqrt(P), inv_a = qp(a, P - 2), pw = qp(a, sz), cur = 1;
for (int i = 0; i <= sz; i++) {
s.insert(make_pair(1ll * b * cur % P, i)), cur = 1ll * cur * inv_a % P;
}
cur = 1;
map <int, int> :: iterator it;
for (int i = 0; i <= sz; i++, cur = 1ll * cur * pw % P) {
if ((it = s.find(cur)) != s.end()) {
return i * sz + (it -> second);
}
}
return -1;
} int main() {
int Tests, a, b, x, t, A, B;
scanf("%d", &Tests);
while (Tests--) {
scanf("%d %d %d %d %d", &P, &a, &b, &x, &t);
a %= P, b %= P, x %= P, t %= P;
if (x == t) {
puts("1"); continue;
} else if (a == 1) {
if (!b) {
puts("-1"); continue;
}
printf("%d\n", 1ll * (t - x + P) * qp(b, P - 2) % P + 1);
continue;
} else if (!a) {
puts(b == t ? "2" : "-1");
continue;
}
A = a, B = 1ll * (1ll * a * t - t + b + P) % P * qp((b - x + 1ll * a * x + P) % P, P - 2) % P;
int ans = bsgs(A, B);
printf("%d\n", ~ans ? ans + 1 : ans);
}
return 0;
}

bzoj3122 [SDOI2013]随机数生成器的更多相关文章

  1. BZOJ3122: [Sdoi2013]随机数生成器(BSGS)

    题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...

  2. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

  3. [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列

    题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...

  4. BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】

    题目 输入格式 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 输出 ...

  5. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  6. 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

    [bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t /* http: ...

  7. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

  8. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  9. 洛咕 P3306 [SDOI2013]随机数生成器

    洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...

随机推荐

  1. C#2.0 委托

    委托 委托是一个非常不错的设计,允许我们把方法做为参数传递,实现了开放閉放原则.在方法中我们只要有一个委托占位,调用者就可以传入符合签名的方法来做不同的操作,这也面向对象开发中多态的魅力. 但是在C# ...

  2. Spring Boot分布式系统实践【1】-架构设计

    前言 [第一次尝试去写一个系列,肯定会有想不到的地方,欢迎大家留言指正] 本系列将介绍如果从零构建一套分布式系统.同时也是对自己过去工作的一个梳理过程. 本文先整理出构建系统的主要技术选型,以及技术框 ...

  3. msf登陆Windows 2

    使用ms17_010(永恒之蓝)进行攻击登陆(XP) 1)加载模块 2)连接靶机 3)设置payload 4)设置lhost(攻击主机IP) 5)exploit进行攻击登陆

  4. leetcode — remove-duplicates-from-sorted-list-ii

    /** * Source : https://oj.leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ * * * Given a ...

  5. 什么是DevOps?

    一. 什么是DevOps 是什么? DevOps (英文 Development 和 Operations 的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序 / 软件工程).技术运营和质量 ...

  6. Spring Boot 2.x (二):How Hello World & 热部署

    本篇摘要 上一篇文章,我们构建了一个HelloWorld的程序,现在,我们来看一下这个程序,下面是我们这一节要分析的点. spring-boot-starter-boot @SpringBootApp ...

  7. 全网Star最多(近20k)的Spring Boot开源教程 2019 年要继续更新了!

    从2016年1月开始写博客,默默地更新<Spring Boot系列教程>,从无人问津到千万访问,作为一个独立站点(http://blog.didispace.com),相信只有那些跟我一样 ...

  8. JAVA_内部类

    内部类 什么是内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类 成员内部类:定义在类中方法外的类 定义格式示例: public class Tesdt { publ ...

  9. Java开发笔记(七十九)利用反射技术操作私有属性

    早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...

  10. 结合JDK源码看设计模式——建造者模式

    概念: 将一个复杂对象的构建与它的表示分离.使得同样构建过程可以创建不同表示适用场景: 一个对象有很多属性的情况下 想把复杂的对象创建和使用分离 优点: 封装性好,扩展性好 详解: 工厂模式注重把这个 ...