题意:

传送门

已知递推公式\(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 p
memset(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 p
ll 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;
}

2019牛客多校第五场C generator 2(BSGS)题解的更多相关文章

  1. 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化

    B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...

  2. 2019 牛客多校第五场 B generator 1

    题目链接:https://ac.nowcoder.com/acm/contest/885/B 题目大意 略. 分析 十进制矩阵快速幂. 代码如下 #include <bits/stdc++.h& ...

  3. 2019牛客多校第五场C generator 2 hash,bsgs模板

    generator 2 题意 给出\(x_0,a,b,p\),有方程\(x_i\equiv (a*x_{i-1}+b)(\% p)\),求最小的i,使得\(x_i=v\),不存在输出-1 分析 经过公 ...

  4. 2019牛客多校第五场B generator 十进制快速幂

    generator 1 题意 给出\(x_0,x_1,a,b\)已知递推式\(x_i=a*x_{i-1}+b*x_{i-2}\),出个n和mod,求\(x_n\) (n特别大) 分析 比赛的时候失了智 ...

  5. 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂

    理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...

  6. 2019牛客多校第五场generator2——BSGS&&手写Hash

    题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内 ...

  7. 2019牛客多校第五场F maximum clique 1 最大独立集

    题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...

  8. 2019牛客多校第五场G-subsequence 1 DP

    G-subsequence 1 题意 给你两个字符串\(s.t\),问\(s\)中有多少个子序列能大于\(t\). 思路 令\(len1\)为\(s\)的子序列的长度,\(lent\)为\(t\)的长 ...

  9. 2019牛客多校第五场H - subsequence 2 拓扑

    H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去 ...

随机推荐

  1. 集成多种协议、用于 USB-A 和 TYPE-C 双端口输出的快充协议芯片IP2726

    1. 特性  支持 1A1C  支持 USB-A 和 TYPE-C 双端口输出  单口输出支持全部快充协议  双口同时插入时降压到 5V  快充规格  集成 QC2.0/QC3.0/QC4/QC4+输 ...

  2. python系统监控及邮件发送

    python系统监控及邮件发送   #psutil模块是一个跨平台库,能轻松实现获取系统运行的进程和系统利用率   import psutil                              ...

  3. Cisco IOS

    IOS Internetwork Operating System 互联网操作系统(基于UNIX系统) Cisco IOS 软件提供多种网络服务进而支持各种网络应用. Cisco IOS用户界面的基本 ...

  4. Ajax编程基础

    目录 Ajax编程基础 传统网站中存在的问题 Ajax概述 Ajax的应用场景 Ajax的运行环境 Ajax运行原理及实现 Ajax运行原理 Ajax的实现步骤 1.创建Ajax对象 2.告诉Ajax ...

  5. NodeJS连接MongoDB数据库

    NodeJS连接MongoDB数据库 连接数据库的js文件[我将其命名为(connect.js)] // 引入mongoose第三方模块 const mongoose = require('mongo ...

  6. 关于jmeter客户端实现中HttpClient4与Java的区别

    如上图:jmeter客户端实现方式有三种,一种是java,一种是httpclient4,还有一种默认,我们来看一下java与httpclient4的区别: Java:选择压测时,链接是复用的(代码中的 ...

  7. WPF TabControl美化

    <Window.Resources> <!-- TabItem的样式 --> <Style TargetType="{x:Type TabItem}" ...

  8. 简单makefile

    https://www.cnblogs.com/prettyshuang/p/5552328.html#_label0

  9. IdentityServer4之Implicit和纯前端好像很配哦

    前言 上一篇Resource Owner Password Credentials模式虽然有用户参与,但对于非信任的第三方的来说,使用这种模式是有风险的,所以相对用的不多:这里接着说说implicit ...

  10. 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库

    目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...