若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)的更多相关文章

  1. 【模板】【数论】二次剩余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 ...

  2. BZOJ 2219 数论之神 (CRT推论+BSGS+原根指标)

    看了Po神的题解一下子就懂了A了! 不过Po神的代码出锅了-solve中"d-temp"并没有什么用QwQQwQQwQ-应该把模数除以p^temp次方才行. 来自BZOJ讨论板的h ...

  3. bzoj5104 Fib数列(BSGS+二次剩余)

    快AFO了才第一次写二次剩余的题…… 显然应该将Fn写成通项公式(具体是什么写起来不方便而且大家也都知道),设t=((1+√5)/2)n,T=√5N,然后可以得到t-(-1)t/t=√5N,两边同时乘 ...

  4. luogu 2480 古代猪文 数论合集(CRT+Lucas+qpow+逆元)

    一句话题意:G 的 sigma d|n  C(n d) 次幂  mod 999911659 (我好辣鸡呀还是不会mathjax) 分析: 1.利用欧拉定理简化模运算 ,将上方幂设为x,则x=原式mod ...

  5. 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

    [bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t /* http: ...

  6. JZOJ 5796 划分 (容斥,数论,扩展CRT)

    题面 有一个未知的序列 x,长度为 n.它的 K-划分序列 y 指的是每连续 K 个数的和得到划 分序列,y[1]=x[1]+x[2]+....+x[K],y[2]=x[K+1]+x[K+2]+... ...

  7. ACM模板_axiomofchoice

    目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...

  8. 板子-GOD BLESS ALL OF YOU

    字符串: KMP #include<cstdio> #include<cstring> ; ]; ]; int l1,l2; void get_next() { next[]= ...

  9. Cipolla算法学习小记

    转自:http://blog.csdn.net/doyouseeman/article/details/52033204 简介 Cipolla算法是解决二次剩余强有力的工具,一个脑洞大开的算法. 认真 ...

随机推荐

  1. 搭建gogs常见问题

    1.无法连接ssh,显示connection refuse. 原因是“custom/conf/app.ini”没有开启ssh功能,改为以下配置就行了  START_SSH_SERVER = true ...

  2. P2521 [HAOI2011]防线修建

    题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...

  3. Windows server install mrtg

    由于MRTG使用Perl语言编写 , 安装ActivePerl http://downloads.activestate.com/ActivePerl/releases/5.20.1.2000/Act ...

  4. JXOI 2017 简要题解

    「JXOI2017」数列 题意 九条可怜手上有一个长度为 \(n\) 的整数数列 \(r_i\) ,她现在想要构造一个长度为 \(n\) 的,满足如下条件的整数数列 \(A\) : \(1\leq A ...

  5. 【Luogu4916】魔力环(Burnside引理,组合计数)

    考虑\(Burside\)引理,设\(f(x)\)表示置换拆成循环的个数为\(x\)时的答案,那么最终的结果就是\(\displaystyle \frac{\sum_{i=1}^n f(gcd(i,n ...

  6. [SPOJ375]QTREE - Query on a tree【树链剖分】

    题目描述 给你一棵树,两种操作. 修改边权,查找边权的最大值. 分析 我们都知道,树链剖分能够维护点权. 而且每一条边只有一个,且唯一对应一个儿子节点,那么就把信息放到这个儿子节点上. 注意,lca的 ...

  7. [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  8. LVS负载均衡集群(DR)

    -----构建DR模式的LVS群集----- --client---------------------LVS------------------------WEB1----------------- ...

  9. 2017蓝桥杯 省赛C题(承压计算)

    X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同.金属材料被严格地堆放成金字塔形. 7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 ...

  10. 200行Go代码实现自己的区块链——区块生成与网络通信

    go启动后,可以用telnet登录访问. 注意端口配置写在.env里面. 源码:https://github.com/mycoralhealth/blockchain-tutorial/tree/ma ...