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模板的更多相关文章

  1. 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 ...

  2. 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}\) 思路 一般看 ...

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

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

  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. Android一个简单的自定义对话框制作

    布局文件 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android= ...

  2. Vmvare扩展虚拟机磁盘大小

    Vmvare设置好虚拟机的磁盘大小之后,发现磁盘空间不够了,这个时候怎么扩展磁盘的大小呢? 首先,在确保虚拟机关闭的情况下,右键设置,选择硬盘,扩展,这样就可以增加磁盘的大小. 但是由于未进行分区和磁 ...

  3. CF round 623 Div.1D Tourism 题解

    题目链接:https://codeforces.com/contest/1314/problem/D 大意: \(n\) 个顶点的有向图,顶点编号为 \(1\) 到 \(n\),任意两个不同的顶点 \ ...

  4. maven的核心概念——聚合

    第十六章聚合 16.1 为什么要使用聚合 将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效.修改源码后也需要逐个手动进行clean操作.而使用了聚合之后就可以批量进行Maven工程的安装 ...

  5. Tunnel Warfare HDU - 1540

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...

  6. gogs搭建git服务教程

    使用gogs搭建自己的git服务!!! 一.GIT服务器搭建方式 上一节课我们讲过GIT是一个分布式版本管理系统,既然是分布那么必定会涉及远程通信,那么GIT是采用什么协议进行远程通信的呢? git支 ...

  7. shadow文件中密码的加密方式

    1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...

  8. 解决officeOnline文档预览服务器只能域名提交的限制Redirect

    此项目是解决officeOnline文档预览只能用域名提交的限制 http://officeOnline文档预览域名或IP/op/generate.aspx // 微软原生页面 创建链接后会生成全屏预 ...

  9. lvs使用进阶

    之前lvs基础篇(https://www.cnblogs.com/ckh2014/p/10855002.html)中介绍了lvs-dr的搭建,下面我们再复习一下,架构如下: 相关配置 director ...

  10. 网站后门shell-----eval

    我们先来看看网站被攻击的代码: <?php error_reporting(E_ERROR); unlink('user.php'); unlink('../member/login.php') ...