题目

几乎原题 BZOJ3122题解

分析

先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法。

在标准的BSGS中,内外层循环都是 $\sqrt p$,题目查询 $m$ 次,$m \leq 1000$,$ p \leq 10^9$,这样总时间复杂度为 $O(m \sqrt p)$,勉强能接受。据说使用读入优化和手写哈希还是能过得,可见Cls的代码%%%

仔细想一下,由于BSGS分成两步,其中第一步是建立 $a$ 的幂次方的表,而题恰好是 $a,p$相同下的一组询问,所以这一部分可以与处理。

显然,我们应该对这部分分大点,第二步就会小写(因为积一定),

如分成 $\sqrt {mp} \times \sqrt{\frac{p}{m}}$(前面是预处理时间,后面是每次查询的时间)

也可以是 $\frac{p}{1000} \times 1000$,总之,要是预处理部分大一点。

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define FI first
#define SE second
#define maxn 100000
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef double db; int mod;
int m=; const int M=;
int hs[M],head[M],nxt[M],id[M],top;
void insert(int x,int y)
{
int k=x%M;
hs[top]=x,id[top]=y,nxt[top]=head[k],head[k]=top++;
}
int find(int x)
{
int k=x%M;
for(int i=head[k];i!=-;i=nxt[i]) if(hs[i]==x) return id[i];
return -;
} int BSGS(int a,int b,int n)
{
if(b==) return ;
ll p=;
int ans=inf;
rep(i,,m)
{
int id=find(1ll*p*b%n);
if(id!=-) ans=min(ans,id-i);
p=p*a%mod;
}
if(ans==inf) return -;
return ans;
} ll qp(ll a,ll k)
{
ll res=;
while(k)
{
if(k&) res=res*a%mod;
a=a*a%mod;
k>>=;
}
return res;
}
ll _inv(ll x) {return qp(x,mod-);} int main()
{
int CAS; scanf("%d",&CAS);
while(CAS--)
{
ll N; int x0,a,b; scanf("%lld%d%d%d%d",&N,&x0,&a,&b,&mod);
memset(head,-,sizeof head); top=; int bn=(mod+m-)/m;
int aA=qp(a,m),pw=aA;
rep(i,,bn)
{
if(find(pw)==-) insert(pw,i*m);
pw=1ll*pw*aA%mod;
}
int Q; scanf("%d",&Q);
while(Q--)
{
int v; scanf("%d",&v);
if(a==)
{
if(v==x0) puts("");
else if(v==b)
{
if(N==) puts("-1");
else puts("");
}
else puts("-1");
}
else if(a==)
{
if(b==)
{
if(v==x0) puts("");
else puts("-1");
}
else
{
ll n=1ll*(v+mod-x0)*_inv(b)%mod;
if(n>=N) puts("-1");
else printf("%lld\n",n);
}
}
else
{
v=(1ll*(a-)*v+b)%mod;
int X=(1ll*(a-)*x0+b)%mod;
if(X==)
{
if(v==) puts("");
else puts("-1");
}
else
{
v=1ll*v*_inv(X)%mod;
if(v==) puts("-1");
else
{
int n=BSGS(a,v,mod);
if(n>=N) puts("-1");
else printf("%d\n",n);
}
}
}
}
}
return ;
}

参考链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41008097

2019牛客多校第五场generator2——BSGS&&手写Hash的更多相关文章

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

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

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

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

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

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

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

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

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

  6. 2019牛客多校第五场B-generator 1(矩阵快速幂)

    generator 1 题目传送门 解题思路 矩阵快速幂.只是平时的矩阵快速幂是二进制的,这题要用十进制的快速幂. 代码如下 #include <bits/stdc++.h> #defin ...

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

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

  8. 2019牛客多校第五场 G subsequence 1 dp+组合数学

    subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩 ...

  9. 2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集

    maximum clique 1 题意 给出一个集合s,求每个子集的最大独立集的权值和(权值是独立集的点个数) 分析 n比较小,一股浓浓的暴力枚举每一个子集的感觉,但是暴力枚举模拟肯定会T,那么想一想 ...

随机推荐

  1. django授权-01--oauth2

    oauth2的提供商:认证服务器 oauth2的消费者:目标服务器 如果目标服务器与认证服务器不一样的话,相当于目标服务器向认证服务器获取用户的信息 如果目标服务器和认证服务器一样的话,相当于用户获取 ...

  2. Codeforces 1245 D. Shichikuji and Power Grid

    传送门 经典的最小生成树模型 建一个点 $0$ ,向所有其他点 $x$ 连一条边权为 $c[x]$ 的边,其他任意两点之间连边,边权为 $(k_i+k_j)(\left | x_i-x_j\right ...

  3. Visual Studio 开发大量 JavaScript 代码项目程序崩溃的解决方案

    最近公司做新项目,基于 Bootstrap.AngularJS 和 kendo 开发一套后台的管理系统,在项目中使用了大量的 JavaScript 文件,这两天 Visual Studio 2015 ...

  4. 学习笔记-Rabin-Karp哈希

    在数学一本通上看过这两人名字,现在又出现了... 思想: 用一个整数表示一个字符串 \(w_{str}\)=(\(a_0\) \(p^{n-1}\)+\(a_1\) \(p^{n-2}\)+...+\ ...

  5. bash shell的ANSI控制

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如:  echo -e "\033[41;36m something here \03 ...

  6. 在浏览器输入 URL 回车之后发生了什么

    注意:本文的步骤是建立在,请求的是一个简单的 HTTP 请求,没有 HTTPS.HTTP2.最简单的 DNS.没有代理.并且服务器没有任何问题的基础上. 大致流程 URL 解析 DNS 查询 TCP ...

  7. Forms Process (FRMWEB) Consumes 100% of CPU in Oracle Applications R12 (文档 ID 745711.1)

    https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=283767243216583&id=745711.1& ...

  8. (15)while循环

    循环结构 : while 循环结构的特点:减少代码的冗余,提高代码的效率注意:只要是循环一定要有判断条件退出循环,不然就成了死循环,程序会一直在内存执行,直到内存耗尽,暴毙..... 语法形式: wh ...

  9. (13)input输入函数

    (1)input 等待用户动态输入一个值,注意得到的值是一个字符串类型 提示用户输入用户名和密码: 如果用户名是admin , 并且密码是000 , 提示用户恭喜你,登陆成功 否则提示用户名或密码错误 ...

  10. 图像处理---视频<->图片

    图像处理---视频<->图片 // 该程序实现视频和图片的相互转换. // Image_to_video()函数将一组图片合成AVI视频文件. // Video_to_image()函数将 ...