cdqz2017-test1-数论 (BSGS + 二次剩余 + CRT)
若m=0,
就是求n^2n ≡ x mod p (x--)
因为一定优解,所以x一定是p的二次剩余
令g为p的1个原根,且g^k ≡ x mod p
则k是偶数,证明k是偶数:
假设
g1^k1 ≡ x mod p
g2^k2 ≡ x mod p,k2是偶数
g1^k3 ≡ g2 mod p
那么 g1^k3k2 ≡ x ≡ g1^k1 mod p
由欧拉定理可得,k3k2 ≡ k1 mod p-1
∴ k1是偶数
所以对于任意g,k是偶数
所以等价于求 n^n ≡ g^(k/2) mod p
显然
满足 n≡ g mod p 且 n ≡ k/2 mod p-1 的n 是一个可行解
又因为p与p-1一定互质,所以用CRT即可求得n
若m≠0
求n^2n+n^m ≡ x mod p
在上面m=0 的时候,我们是令 n ≡ g mod p
即 n^m ≡ g^m mod p
能解出合法的n的条件是 x-n^m 是p的二次剩余
所以尝试枚举g,判断x-g^m 是否是p的二次剩余
判断方法:利用欧拉准则计算勒让德符号,即 判断(x-n^m)^ ((p-1)/2) mod p 是否等于1
如果x-g^m 是 p的二次剩余
方程变成 n^2n ≡ x-g^m mod p
令g^k ≡ x-g^m mod p
用BSGS求出一个满足上述条件的k
若k是偶数
那么方程就变成了 n^n ≡ g^(k/2) mod p
满足 n≡ g mod p 且 n ≡ k/2 mod p-1 的n 是一个可行解
又因为p与p-1一定互质,所以用CRT即可求得n
#include<map>
#include<cmath>
#include<cstdio>
#include<iostream> using namespace std; map<int,int>mp; int Pow(int a,int b,int p)
{
int res=1;
for(;b;a=1LL*a*a%p,b>>=1)
if(b&1) res=1LL*res*a%p;
return res;
} long long Mul(long long a,int b,long long p)
{
long long res=0;
while(b)
{
if(b&1) res+=a,res%=p;
b>>=1; a+=a; a%=p;
}
return res;
} bool Legendre(int n,int p)
{
return Pow(n,p-1>>1,p)+1!=p;
} int bsgs(int a,int b,int p)
{
mp.clear();
int m=sqrt(p);
mp[b]=0;
for(int i=1;i<=m;++i)
{
b=1LL*a*b%p;
mp[b]=i;
}
int am=Pow(a,m,p);
int mul=1;
for(int i=1;i<=m;++i)
{
mul=1LL*mul*am%p;
if(mp.find(mul)!=mp.end()) return i*m-mp[mul];
}
return -1;
} int inv(int a,int p)
{
return Pow(a,p-2,p);
} int main()
{
freopen("theory.in","r",stdin);
freopen("theory.out","w",stdout);
int x,m,p;
scanf("%d%d%d",&x,&m,&p);
if(p==2) printf("1");
int y;
long long ans;
for(int g=1;;++g)
{
if(!Legendre(x-Pow(g,m,p),p)) continue;
y=bsgs(g,(x-Pow(g,m,p)+p)%p,p);
if(y==-1 || (y&1)) continue;
long long P=1LL*p*(p-1);
ans=Mul(1LL*(p-1)*inv(p-1,p)%P,g,P)+1LL*p*(y/2)%P;
ans%=P;
cout<<ans;
return 0;
}
}
cdqz2017-test1-数论 (BSGS + 二次剩余 + CRT)的更多相关文章
- 【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法
Cipolla LL ksm(LL k,LL n) { LL s=1; for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo; return s; } n ...
- BZOJ 2219 数论之神 (CRT推论+BSGS+原根指标)
看了Po神的题解一下子就懂了A了! 不过Po神的代码出锅了-solve中"d-temp"并没有什么用QwQQwQQwQ-应该把模数除以p^temp次方才行. 来自BZOJ讨论板的h ...
- bzoj5104 Fib数列(BSGS+二次剩余)
快AFO了才第一次写二次剩余的题…… 显然应该将Fn写成通项公式(具体是什么写起来不方便而且大家也都知道),设t=((1+√5)/2)n,T=√5N,然后可以得到t-(-1)t/t=√5N,两边同时乘 ...
- luogu 2480 古代猪文 数论合集(CRT+Lucas+qpow+逆元)
一句话题意:G 的 sigma d|n C(n d) 次幂 mod 999911659 (我好辣鸡呀还是不会mathjax) 分析: 1.利用欧拉定理简化模运算 ,将上方幂设为x,则x=原式mod ...
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- JZOJ 5796 划分 (容斥,数论,扩展CRT)
题面 有一个未知的序列 x,长度为 n.它的 K-划分序列 y 指的是每连续 K 个数的和得到划 分序列,y[1]=x[1]+x[2]+....+x[K],y[2]=x[K+1]+x[K+2]+... ...
- ACM模板_axiomofchoice
目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...
- 板子-GOD BLESS ALL OF YOU
字符串: KMP #include<cstdio> #include<cstring> ; ]; ]; int l1,l2; void get_next() { next[]= ...
- Cipolla算法学习小记
转自:http://blog.csdn.net/doyouseeman/article/details/52033204 简介 Cipolla算法是解决二次剩余强有力的工具,一个脑洞大开的算法. 认真 ...
随机推荐
- 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模
题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...
- 【XSY1476】平凡之路 斜率优化DP
题目大意 有\(n\)个格子,一开始你在\(1\)号格子.每次你只能往编号更大的格子走.从第\(i\)个格子走到第\(j\)个格子的代价是\(a_i+a_j\times(j-i)\times m\) ...
- wstngfw IKEv2服务器配置示例
wstngfw IKEv2服务器配置示例 移动客户端的服务器配置有几个组件: 为***创建一个证书结构 配置IPsec移动客户端设置 为客户端连接创建阶段1和阶段2 添加IPsec防火墙规则 创建** ...
- android TextView字体设置最少占多少行. 及其 Java String 字符串操作 . .
① 字体设置: 修改代码 : GridViewActivity.java priceTv为 TextView priceTv.setMaxLines(3); //当多与7个字fu的时候 , 其余字 ...
- Android ViewSwitcher 的功能与用法
ViewSwitcher 代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitch ...
- hexo报错集锦
1.报错信息如下 FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubles ...
- POJ 2672 Tarjan + 缩点 + 拓扑思想
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17383 ...
- push的时候报错:Permission denied (publickey)
最近,在push的时候遇到一个问题,简单描述下过程(git客户端命令行操作) 我先在本地建了一个文件夹,mkdir dubbodemo 然后进入到这个文件夹,cd dubbodemo 添加我的内容 初 ...
- CAN协议,系统结构和帧结构
CAN:Controller Area Network,控制器局域网 是一种能有效支持分布式控制和实时控制的串行通讯网络. CAN-bus: Controller Area Network-bus,控 ...
- C# Winfrom MDI(多文档界面)
1.首先设置父级Form1界面,只需要将该界面的IsMdiContainer属性设置为true: 2.设置按钮的事件来打开子级的窗口Form2,Form3等等: 3.在From1内设置一个容器pane ...