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算法是解决二次剩余强有力的工具,一个脑洞大开的算法. 认真 ...
随机推荐
- 搭建gogs常见问题
1.无法连接ssh,显示connection refuse. 原因是“custom/conf/app.ini”没有开启ssh功能,改为以下配置就行了 START_SSH_SERVER = true ...
- P2521 [HAOI2011]防线修建
题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...
- Windows server install mrtg
由于MRTG使用Perl语言编写 , 安装ActivePerl http://downloads.activestate.com/ActivePerl/releases/5.20.1.2000/Act ...
- JXOI 2017 简要题解
「JXOI2017」数列 题意 九条可怜手上有一个长度为 \(n\) 的整数数列 \(r_i\) ,她现在想要构造一个长度为 \(n\) 的,满足如下条件的整数数列 \(A\) : \(1\leq A ...
- 【Luogu4916】魔力环(Burnside引理,组合计数)
考虑\(Burside\)引理,设\(f(x)\)表示置换拆成循环的个数为\(x\)时的答案,那么最终的结果就是\(\displaystyle \frac{\sum_{i=1}^n f(gcd(i,n ...
- [SPOJ375]QTREE - Query on a tree【树链剖分】
题目描述 给你一棵树,两种操作. 修改边权,查找边权的最大值. 分析 我们都知道,树链剖分能够维护点权. 而且每一条边只有一个,且唯一对应一个儿子节点,那么就把信息放到这个儿子节点上. 注意,lca的 ...
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- LVS负载均衡集群(DR)
-----构建DR模式的LVS群集----- --client---------------------LVS------------------------WEB1----------------- ...
- 2017蓝桥杯 省赛C题(承压计算)
X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同.金属材料被严格地堆放成金字塔形. 7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 ...
- 200行Go代码实现自己的区块链——区块生成与网络通信
go启动后,可以用telnet登录访问. 注意端口配置写在.env里面. 源码:https://github.com/mycoralhealth/blockchain-tutorial/tree/ma ...