题意:

传送门
已知递推公式\(x_i = a*x_{i - 1} + b\mod p\),\(p\)是素数,已知\(x_0,a,b,p\),给出一个\(n\)和\(v\),问你满足\(x_i = v\)且\(i < n\)的最小的\(i\)是多少。

思路:

经过一些举例我们可以发现\(x_i = a^ix_0 + b\frac{a^i-1}{a-1}\mod p\),当\(a \neq 1\)可得\(a^i = \frac{(a-1)v+b}{(a-1)x_0+b}\mod p\)。再当\(a \geq 1\)时可用\(BSGS\)求解,其他直接特判。
但是因为\(q\)的存在,如果直接套模板复杂度\(O(\sqrt p + q\sqrt p)\),\(3e7*T\)必\(TLE\)。因为每组询问的预处理都相同,那么我们不妨把预处理扩大,这样每次查询所要暴力的次数就变小了。预处理大小设为\(1e6\),手写\(Hash\)更快。

代码:

#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 300 + 5;
const int INF = 0x3f3f3f3f;
const ull seed = 131;
const ll MOD = 1e9;
using namespace std;//BSGS
const int M = 5e6;
int hs[M], head[M], nex[M], id[M], top;
void _insert(ll x, int y){int k = x % M;hs[top] = x, id[top] = y, nex[top] = head[k], head[k] = top++;
}
int _find(ll x){int k = x % M;for(int i = head[k]; i != -1; i = nex[i]){if(hs[i] == x) return id[i];}return -1;
}
ll ppow(ll a, ll b, ll mod){ll ret = 1;while(b){if(b & 1) ret = ret * a % mod;a = a * a % mod;b >>= 1;}return ret;
}
ll loop, up;
void preBSGS(ll p, ll a){   // a^x = b mod pmemset(head, -1, sizeof(head));top = 1;up = ceil(1e6);ll t = 1;for(int i = 0; i <= up; i++){if(i == up) loop = t;_insert(t, i);t = 1LL * t * a % p;}
}
ll BSGS(ll A, ll B, ll P){  // a^x = b mod pll m = ceil(P * 1.0 / 1e6);ll obj = ppow(B, P - 2, P), x;for(int i = 1; i <= m; i++){obj = 1LL * obj * loop % P;if((x = _find(obj)) != -1){return 1LL * i * up - x;}}return -1;
}
ll n, x0, a, b, p, Q;
int main(){int T;scanf("%d", &T);while(T--){scanf("%lld%lld%lld%lld%lld", &n, &x0, &a, &b, &p);scanf("%lld", &Q);preBSGS(p, a);while(Q--){ll v;scanf("%lld", &v);if(a == 0){if(v == x0) printf("0\n");else if(v == b && n - 1 >= 1) printf("1\n");else printf("-1\n");}else if(a == 1){v = ((v - x0) % p + p) % p;if(b == 0){printf("%d\n", v == 0? 0 : -1);continue;}ll ans = 1LL * v * ppow(b, p - 2, p) % p;printf("%lld\n", ans >= n? -1 : ans);}else{ll ret = (a * v % p - v + b) % p;ret = ret * ppow((a * x0 - x0 + b) % p, p - 2, p) % p;ret = (ret + p) % p;ll ans = BSGS(a, ret, p);printf("%lld\n", ans >= n? -1 : ans);}}}return 0;
}

转载于:https://www.cnblogs.com/KirinSB/p/11403974.html

2019牛客多校第五场C generator 2(BSGS)题解相关推荐

  1. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  2. subsequence 1(牛客多校第五场记忆化搜索+组合数学)

    链接:https://ac.nowcoder.com/acm/contest/885/G 来源:牛客网 题目描述 You are given two strings s and t composed ...

  3. 2019牛客多校训练营第一场 H题 HOR 题解

    题目描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  4. 2019牛客多校 第七场 B Irreducible Polynomial 多项式因式分解判断

    链接:https://ac.nowcoder.com/acm/contest/887/B 来源:牛客网 Irreducible Polynomial 时间限制:C/C++ 1秒,其他语言2秒 空间限制 ...

  5. 2019牛客多校训练营第一场 E题 ABBA 题解

    问题描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  6. 2019牛客多校第七场 C Governing sand

    因为当时时间不怎么够就没写... 其实就是一个模拟题而已下面注释很清楚 链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 时间限制:C/C++ 3 ...

  7. 2021牛客多校第五场补题

    B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n​ boxes in front o ...

  8. 牛客多校第五场7月31日补题记录

    B Boxes 题意:有 nnn 个盒子,每个盒子中装有黑球白球概率均为 12\displaystyle \frac{1}{2}21​.打开第 iii 个盒子所需代价为 wiw_iwi​.现在有一个机 ...

  9. 2019牛客多校第四场 B xor (线性基求交)

    xor 思路 题目是要求[l,r][l, r][l,r]的所有集合是否都可以得到xxx,那么显然我们可以对这[l,r][l, r][l,r]个线性基求交,然后再特判能否xxx能否插入,如果能插入,显然 ...

  10. 2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

    文章目录 description solution code description 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b},满足∑i=1Kai= ...

最新文章

  1. leetcode 203 Remove Linked List Elements
  2. OpenCV人脸检测与三角剖分绘制
  3. 使用FP-growth算法发现频繁项集
  4. 老外听到哪些中式英文是崩溃的?(转自外贸Jackson)
  5. OpenCV方向梯度直方图HOG的实例(附完整代码)
  6. 版本管理工具:git svn 的比较
  7. sdk是什么_人脸识别在美颜SDK中存在什么意义?
  8. Linux | Ubuntu:十年,十个关键时刻
  9. ORB-SLAM2双目开源框架 (1)
  10. oracle序列可以创建同义词吗,Oracle基础教程:同义词与序列
  11. 同源、跨域、跨站、SameSite与withCredentials
  12. xp的ie显示无服务器,WinXP系统IE无法打开站点怎么办?
  13. 一个不超过200行的游戏
  14. 为啥扫描服务器端口无响应,服务器端口扫描工具
  15. 全渠道营销与多渠道营销:定义、比较、示例
  16. 24.树莓派交叉编译工具链的安装
  17. 实用的19条android平台设计规范
  18. 终端代理以及git加速
  19. jQueryanimation实现漂流瓶扔和写动画效果
  20. 03-Mybatis的关键核心类说明

热门文章

  1. Ionic开发App中重要的部分
  2. Werkzeug 库——routing 模块简析
  3. 忆2015,迎2016(致敬自己)
  4. mysql 新增字段 添加字段 删除字段 修改字段 级联删除 级联更新 等
  5. Stereoscopic Player 1.7.4 (SSP) 加载字幕
  6. B树与B+树 有动画
  7. windows server 安装php环境
  8. Java 8 异步 API、循环、日期,用好提高生产力!
  9. 雅虎开源色情图片检测神经网络
  10. 3分钟看懂 Linux 磁盘划分