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. C# 数组冒泡排序复习

    using System; namespace runoob { class MyClass { static void Main(string[] args) { MyClass1 myClass ...

  2. 最全的计算机Java毕业设计题目大全 附 源码

    本文提供数百个计算机毕设题目可以参考 并提供成品源码下载,都是从网上收集而来 源码技术全部采用java+MySQL开发,并结合了其他技术如ssm,ssh,jsp等等. 下载链接在文末! 以下是项目名称 ...

  3. Mac IDEA 2019.3.1下载及破解,可激活至2089年

    背景 目前IDEA已更新到2019.3.3,但是下载这个版本后使用目前网上的常见破解方法会出现各种问题.比如使用注册码方式提示license key is in legacy format,或者使用L ...

  4. (转)java 多线程 对象锁&类锁

    转自:http://blog.csdn.net/u013142781/article/details/51697672 最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不 ...

  5. Python 一键安装全部依赖包

    使用 pip requirements.txt 用来记录项目所有的依赖包和版本号,只需要一个简单的 pip 命令就能完成. pip freeze > requirements.txt 生成的文件 ...

  6. LVS负载均衡工作模式和调度算法

    原文链接:https://blog.csdn.net/weixin_40470303/article/details/80541639 一.LVS简介 LVS(Linux Virtual Server ...

  7. [转载]Ubuntu 使用Compiz配置炫酷3D桌面

    原文地址 个人引言: 这个Compiz使用与我的这篇Blog:打摆不顺利?是你没看这篇!相互有联系.这个Compiz是打摆工具之一,可以把打摆窗口调成透明,这样机房监控拍下来的屏幕会是打摆窗口下面的某 ...

  8. 【5】激活函数的选择与权值w的初始化

    激活函数的选择: 西格玛只在二元分类的输出层还可以用,但在二元分类中,其效果不如tanh,效果不好的原因是当Z大时,斜率变化很小,会导致学习效率很差,从而很影响运算的速度.绝大多数情况下用的激活函数是 ...

  9. SGDClassifier梯度下降分类方法

    SGDClassifier梯度下降分类方法 这个分类器跟其他线性分类器差不多,只是它用的是mini-batch来做梯度下降,在处理大数据的情况下收敛更快 1.应用 SGD主要应用在大规模稀疏数据问题上 ...

  10. 二分类模型之logistic

    liner classifiers 逻辑回归用在2分类问题上居多.它是一个非线性的回归模型,其最大的好处恰恰是可以解决二元类问题,目前在金融行业,基本都是使用Logistic回归来预判一个用户是否为好 ...