BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
题目描述
在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出满足 (1) X^A = B(mod 2*K + 1) (2) X 在范围[0, 2K] 内的X的个数!自然数论之神是可以瞬间秒杀此题的,那么你呢?
输入
第一行有一个正整数T,表示接下来的数据的组数( T <= 1000) 之后对于每组数据,给出了3个整数A,B,K (1 <= A, B <= 10^9, 1 <= K <= 5 * 10^8)
输出
输出一行,表示答案
样例输入
213 46290770 80175784
3 46290770 80175784
3333 46290770 80175784
样例输出
27
297
这题果然数论神题啊,写了三遍才A掉。做这题之前建议先做一下弱化版BZOJ1319。
模数是$2*K+1$(我们设$P=2*K+1$),显然不一定是质数。一般碰到模数不是质数的情况我们会想能否将模数质因数分解成互质的几个数然后通过解决子问题来获得问题答案,这道题也是可以的,对于$P$将它质因数分解为$p_{1}^{a_{1}}*p_{2}^{a_{2}}*...*p_{k}^{a_{k}}$,然后分别解决$x^A\equiv B(mod\ p_{i}^{a_{i}})$的解的个数,再将每个子问题解个数相乘即可得到原问题解的个数。为什么?因为$x^A\equiv B(mod P)$即$x^A-n*P=B$,那么$x^A-n_{i}*p_{i}^{a_{i}}=B$(即将P的其他部分移到$n_{i}$中)。那么$x_{i}^A\equiv B(mod\ p_{i}^{a_{i}})$(不考虑$p_{i}^{a_{i}}$与$B$的大小关系),因为在原式中$x\in [0,P)$,而新式子中$x_{i}\in [0,p_{i}^{a_{i}})$,所以$x\equiv x_{i}(mod\ p_{i}^{a_{i}})$,对于这$k$个子问题每个求出一个解$x_{i}$,用中国剩余定理都能求出唯一的原式解$x$。
现在考虑如何解决$x_{i}^A \equiv B(mod\ p_{i}^{a_{i}})$,先考虑$B$与$p_{i}^{a_{i}}$的关系:
1、$gcd(B,p_{i}^{a_{i}})=p_{i}^{a_{i}}$,即$B$是$p_{i}^{a_{i}}$的倍数,那么$x_{i}^A$中至少要有$p_{i}^{a_{i}}$,$x_{i}$中至少要有$p_{i}^{\left \lceil \frac{a_{i}}{A} \right \rceil}$,所以$x_{i}$要是$p_{i}^{\left \lceil \frac{a_{i}}{A} \right \rceil}$的倍数,在$[0,p_{i}^{a_{i}})$中这样的数个数为$p_{i}^{a_{i}-\left \lceil \frac{a_{i}}{A} \right \rceil}$。
2、$gcd(B,p_{i}^{a_{i}})=1$,我们求出$p_{i}^{a_{i}}$的原根$g$(求原根的方法是求出$\phi(p_{i}^{a_{i}})$的所有质因子$q_{1}...q_{k}$,然后从$2$开始枚举原根,如果一个数$G$满足$\forall G^{\frac{\phi(p_{i}^{a_{i}})}{q_{j}}}mod\ p_{i}^{a_{i}}\neq1$即为原根)。将$B$和$x_{i}$分别求出指标$indB$和$indx_{i}$,原式就变成了$A*indx_{i}\equiv indB(mod\ \phi(p_{i}^{a_{i}}))$,那么根据扩展欧几里得可知,若$indB\%gcd(A,\phi(p_{i}^{a_{i}})=0$,那么解的个数就是$gcd(A,\phi(p_{i}^{a_{i}})$。(解一下不定方程即可得到此结论)
3、$gcd(B,p_{i}^{a_{i}})>1$,设$B=m*p_{i}^{z}$,显然$x^A$中$p_{i}$的幂次只能是$z$,那么$A$必须是$z$的约数。我们将$x_{i}^A,B,p_{i}^{a_{i}}$都除掉$p_{i}^{z}$这一部分,问题就转化成第二种情况了。但并不是这样就完事了,我们发现原式中$x_{i}\in[0,p_{i}^{a_{i}}),\frac{x_{i}}{p_{i}^{\frac{z}{A}}}\in[0,p_{i}^{a_{i}-\frac{z}{A}})$,而除完的式子中的$x_{i}$(即原式中的$\frac{x_{i}}{p_{i}^{\frac{z}{A}}}$)$\in[0,p_{i}^{a_{i}-z})$,值域减小了,对于同余方程我们将值域扩大$k$倍,解的个数就会扩大$k$倍,所以最后还要乘上$p_{i}^{z-\frac{z}{A}}$。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define INF 2e9
using namespace std;
ll A,B,K;
ll g,f,p;
ll phi;
int T;
int prime[100010];
int cnt;
map<ll,int>mp;
ll quick(ll x,ll y,ll mod)
{
ll res=1ll;
while(y)
{
if(y&1)
{
res=res*x%mod;
}
x=x*x%mod;
y>>=1;
}
return res;
}
ll gcd(ll x,ll y)
{
return y==0?x:gcd(y,x%y);
}
ll get_ori(ll mod,ll phi)
{
ll n=phi;
cnt=0;
for(int i=2;1ll*i*i<=phi;i++)
{
if(phi%i==0)
{
prime[++cnt]=i;
while(phi%i==0)
{
phi/=i;
}
}
}
if(phi!=1)
{
prime[++cnt]=phi;
}
for(int i=1;i<=n;i++)
{
bool flag=true;
for(int j=1;j<=cnt;j++)
{
if(quick(i,n/prime[j],mod)==1)
{
flag=false;
break;
}
}
if(flag)
{
return i;
}
}
}
ll BSGS(ll g,ll mod,ll x,ll phi)
{
ll n=ceil(sqrt(mod));
mp.clear();
ll sum=1ll;
for(int i=1;i<=n;i++)
{
sum*=g,sum%=mod;
mp[sum]=i;
}
ll num=1ll;
for(int i=0;i<=n;i++)
{
ll inv=quick(num,phi-1,mod)*x%mod;
if(mp[inv])
{
return i*n+mp[inv];
}
num*=sum,num%=mod;
}
}
ll solve(ll p,ll k)
{
ll mod=quick(p,k,INF);
if(B%mod==0)
{
return quick(p,k-(k-1)/A-1,INF);
}
ll b=B;
ll num=0;
while(b%p==0)
{
num++;
b/=p;
mod/=p;
k--;
}
if(num%A)
{
return 0;
}
ll phi=mod-(mod/p);
g=get_ori(mod,phi);
f=BSGS(g,mod,b,phi);
ll d=gcd(A,phi);
if(f%d)
{
return 0;
}
return d*quick(p,num-num/A,INF);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&A,&B,&K);
ll ans=1ll;
p=2*K+1;
for(int i=2;1ll*i*i<=p;i++)
{
if(p%i==0)
{
int num=0;
while(p%i==0)
{
num++;
p/=i;
}
ans*=solve(i,num);
}
}
if(p!=1)
{
ans*=solve(p,1);
}
printf("%lld\n",ans);
}
}
BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd的更多相关文章
- bzoj2219: 数论之神
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2219.html 题目传送门 - BZOJ2219 题意 求同余方程 $x^A\equiv B \pmo ...
- 51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1123.html 题目传送门 - 51Nod1123 题意 $T$ 组数据. 给定 $A,B,C$,求 ...
- BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理
题目描述 给出三个整数p,k,a,其中p为质数,求出所有满足x^k=a (mod p),0<=x<=p-1的x. 输入 三个整数p,k,a. 输出 第一行一个整数,表示符合条件的x的个数. ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 【BZOJ】【2219】数论之神
中国剩余定理+原根+扩展欧几里得+BSGS 题解:http://blog.csdn.net/regina8023/article/details/44863519 新技能get√: LL Get_yu ...
- 【中国剩余定理】【容斥原理】【快速乘法】【数论】HDU 5768 Lucky7
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai 的数 ...
- 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)
F - Strange Way to Express Integers Time Limit:1000MS Memory Limit:131072KB 64bit IO Format: ...
- 中国剩余定理(CRT)与欧拉函数[数论]
中国剩余定理 ——!x^n+y^n=z^n 想必大家都听过同余方程这种玩意,但是可能对于中国剩余定理有诸多不解,作为一个MOer&OIer,在此具体说明. 对于同余方程: x≡c1(mod m ...
随机推荐
- Eclipse MAT内存分析工具(Memory Analyzer Tool)
MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...
- 深入浅出Tomcat/2 - Tomcat启动和停止
Tomcat启动和停止 很明显,我们启动或停止Tomcat,一般调用的是bin下的startup.sh或shutdown.sh(以Linux为例,以下涉及到平台,若无特殊说明,一般都指Linux).我 ...
- C#(.NET) HMAC SHA256实现
HMAC SHA256的实现比较简单,可以用多种语言实现,下面我用C#语言实现,一种结果是居于BASE64,另外一种是居于64位. C# HMAC SHA256 (Base64) using Syst ...
- Python入门-格式化输出
需求:将用户的姓名.年龄.工作.爱好 ,然后打印成以下格式: ------------ Info of Tom ------ Name : Tom Age : 22 Job : Teacher Hob ...
- 闽江学院软件学院2016级JAVA构建之法-学生自学兴趣小组招募通知
为提升我2016级学生提升JAVA软件开发学习氛围,鼓励更多同学通过自学.团队学习.在线(社区)学习等方式学习并掌握JAVA课程,尤其是鼓励同学们通过微软中国邹欣老师所倡导的"构建之法&qu ...
- 阿里字体css代码引入方法
1.第一步,选择自己想要的图标字体,添加入库. 2.选择下载代码. 3.我们可以发现,有如下的代码被下载下来了. 4.我们选择iconfont.css放到自己的文件夹中. 5.然后我们根据下载下来ht ...
- semantic-ui 分割线
分割线即原生html中的<hr>标签.不过semantic-ui中将<hr>美化了一下下. 1.基础分割线 需要注意的是分割线只能使用div标签和p标签,不能使用span标签. ...
- CGI、FAST-CGI、PHP-CGI、PHP-FPM的关系
转自:https://www.awaimai.com/371.html 关于这一类的文章还有:https://zhuanlan.zhihu.com/p/20694204 在搭建 LAMP/LNMP 服 ...
- Linux之基础知识
在此总结使用Linux的时候,一些必须知道的基础内容,记录一下,加强记忆 一. linux 运行级别 运行级别就是操作系统当前正在运行的功能级别.这个级别从0到6 ,具有不同的功能.这些级别在/et ...
- 硬盘扩容9999T
win+r运行创建命令:subst H: d:\123说明:H指的是想要创建的盘符,d:\123是文件路径 删除命令subst H: d/说明 :H指的是已创建的盘符,/d指的是删除的意思 注意新盘符 ...