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
分析
经过公式运算可以知道,当a!=1时,由等比数列求和我们可以知道,\(v=x_n=x_0*a^n+b*\frac{a^n-1}{a-1}\),化简得\(a^n\equiv \frac{(a-1)v+b}{(a-1)x0+b} (\% p)\) 这样就转化成了bsgs的形式,直接套用bsgs即可。这里需要注意的是,因为由q次询问,bsgs需要预处理没有询问参数v的一端,然后再在询问询问里面查找另外一段,这里考察的是活用bsgs,因为这和平常的bsgs是相反的,其次需要知道的是,使用unordered_map可以卡过去,但是稳一点还是手写hash
注意要特判左边算出来是1的情况
a=0和a=1也需要特判
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+3;
namespace Hash{
const int maxn=1e6+3;
int cnt,head[maxn],nxt[maxn];
ll val[maxn],pos[maxn];
void init(){
cnt=0;
memset(head,-1,sizeof(head));
}
void insert(ll x,ll y){
ll tx=x%maxn;
val[cnt]=x,pos[cnt]=y;
nxt[cnt]=head[tx];
head[tx]=cnt++;
}
ll get(ll x){
ll tx=x%maxn;
for(int i=head[tx];~i;i=nxt[i]){
if(val[i]==x) return pos[i];
}
return -1;
}
}
unordered_map<ll,ll>mp;
long long n,x0,a,b,p;
ll mul(ll a,ll b){return 1ll*a%p*b%p;}
ll fpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1)ans=mul(ans,a);
a=mul(a,a);
b>>=1;
//cout<<ans<<endl;
}
return ans;
}
ll inv(ll x){
return fpow(x,p-2);
}
ll add(ll a,ll b){return (a%p+b%p+p)%p;}
int main(){
int t;
scanf("%d",&t);
while(t--){
ll q,v;
//mp.clear();
Hash::init();
scanf("%lld%lld%lld%lld%lld",&n,&x0,&a,&b,&p);
scanf("%lld",&q);
ll m=sqrt(p)+1;
ll t=fpow(a,m);
ll s=1;
for(int i=1;i<=m;i++){
/* if(!mp.count(s)){
mp[s]=i*m;
}*/
s=1ll*s*t%p;
ll tp=Hash::get(s);
if(tp==-1) Hash::insert(s,i*m);
}
while(q--){
scanf("%lld",&v);
// mp.clear();
if(a==0){
if(x0==v)printf("0\n");
else if(v==b)printf("1\n");
else printf("-1\n");
continue;
}
if(a==1){
ll ans=((v-x0+p)%p)*inv(b)%p;
if(ans<n)printf("%lld\n",ans);
else printf("-1\n");
continue;
}
ll y=mul(add(b,mul(v,a-1)),inv(((mul(a,x0)-x0+p)%p+b)%p));
//cout<<"y "<<y<<endl;
ll ans=p+1;
ll s=y;
if(y==1){
printf("0\n");
continue;
}
for(int i=0;i<m;i++){
/* if(mp.count(s)){
ans=min(ans,mp[s]-i);
}*/
ll tp=Hash::get(s);
if(tp!=-1) ans=min(ans,tp-i);
s=s*a%p;
}
if(ans>p||ans>=n)printf("-1\n");
else printf("%lld\n",ans);
}
}
return 0;
}
2019牛客多校第五场C generator 2 hash,bsgs模板的更多相关文章
- 2019牛客多校第五场C generator 2(BSGS)题解
题意: 传送门 已知递推公式\(x_i = a*x_{i - 1} + b\mod p\),\(p\)是素数,已知\(x_0,a,b,p\),给出一个\(n\)和\(v\),问你满足\(x_i = v ...
- 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}\) 思路 一般看 ...
- 2019 牛客多校第五场 B generator 1
题目链接:https://ac.nowcoder.com/acm/contest/885/B 题目大意 略. 分析 十进制矩阵快速幂. 代码如下 #include <bits/stdc++.h& ...
- 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特别大) 分析 比赛的时候失了智 ...
- 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂
理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...
- 2019牛客多校第五场generator2——BSGS&&手写Hash
题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内 ...
- 2019牛客多校第五场F maximum clique 1 最大独立集
题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...
- 2019牛客多校第五场G-subsequence 1 DP
G-subsequence 1 题意 给你两个字符串\(s.t\),问\(s\)中有多少个子序列能大于\(t\). 思路 令\(len1\)为\(s\)的子序列的长度,\(lent\)为\(t\)的长 ...
- 2019牛客多校第五场H - subsequence 2 拓扑
H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去 ...
随机推荐
- Kemaswill 机器学习 数据挖掘 推荐系统 Python optparser模块简介
Python optparser模块简介
- PHP0005:PHP基础--函数
- windows系统安装Java(详细版)
1.下载JDK 官网下载: www.oracle.com/technetwork… 百度云下载: pan.baidu.com/s/1LGf3Podz…提取码:s6mg (官网下载步骤) 进入官网 ht ...
- 360独角兽实习,连载周记(gnuradio 低功耗蓝牙BLE 综合工具模块编写)
(有点乱,之后会有整理) 最近在用写一套gnuradio的OOT模块,主要用来进行BLE嗅探的,github上有了一些工具,可是他们并没有很好的模块化,于是打算自己写一个,这样以后做一些其他的项目,模 ...
- 获取redis指定实例中所有的key
需求:获取redis指定的实例中所有的key的名字. 千万不要使用keys *,可以使用scan命令的递归方式获取. 以下给出自己写的脚本,经过测试效果还可以. db_ip=5.5.5.101 db_ ...
- ECMAScript基本语法——⑥流程控制语句
if...else...switch...case... 在java中能接收的数据类型:byte .short.char.int.枚举类型(JDK5.0新增).String类型(JDK7.0新增) s ...
- Bootstrap 警告框(Alert)插件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Network Initialization: Fan-in and Fan-out
https://github.com/pytorch/pytorch/blob/master/torch/nn/init.py @weak_script def _calculate_fan_in_a ...
- Struts2学习-struts.xml文件配置
学习框架过程中,一直对框架中的配置文件比较难理解,特搜集资料简要记录一下struts.xml文件遇到的问题. <?xml version="1.0" encoding=&qu ...
- 【资源分享】Gmod自瞄自动开枪脚本
*----------------------------------------------[下载区]----------------------------------------------* ...