给出一组正整数$x,n,r$,使得$r^2\equiv x(mod\: n)$,求出所有满足该等式的$r$。

假设有另一个解$r'$满足条件,则有$r^2-r'^2=kn$

因式分解,得$(r+r')(r-r')=kn$

将$n$分解成$a*b$,则有$\left\{\begin{matrix}r+r'=xa\\ r-r'=yb\end{matrix}\right.$

两式相加得$2r=xa+yb$,这是一个二元线性不定方程,可用扩欧求出x的通解。

假设已经求出了$x$的通解$x=x_{0}+k\Delta x$,

由于$r+r'=xa$,所以$r'=xa-r=(x_{0}+k\Delta x)a-r=x_{0}a-r+k(a\Delta x)$,

设$\Delta t=a\Delta x$,则$r'_{0}=((x_{0}a-r)\%\Delta t+\Delta t)\%\Delta t$为$r'$的第一个非负整数解

因此$r'$的通解为$r'=r'_{0}+k\Delta t$

枚举所有的$a,b$,将所有$r'$的可行解插入一个集合里就行了。

 #include<bits/stdc++.h>

 using namespace std;
typedef long long ll;
ll x,n,r,ka;
set<ll> st;
void exgcd(ll a,ll b,ll& x,ll& y,ll& g) {
if(!b)x=,y=,g=a;
else exgcd(b,a%b,y,x,g),y-=x*(a/b);
} void solve(ll a,ll b) {
ll c=*r,x,y,g;
exgcd(a,b,x,y,g);
if(c%g)return;
x*=c/g;
ll dx=abs(b/g);
ll dt=dx*a;
ll t=((a*x-r)%dt+dt)%dt;
for(; t<n; t+=dt)st.insert(t);
} int main() {
while(scanf("%lld%lld%lld",&x,&n,&r)&&x) {
st.clear();
for(ll i=; i*i<=n; ++i)if(n%i==)solve(i,n/i),solve(n/i,i);
printf("Case %lld:",++ka);
for(ll i:st)printf(" %lld",i);
printf("\n");
}
return ;
}

UVALive - 4270 Discrete Square Roots (扩展欧几里得)的更多相关文章

  1. UVALive 4270 Discrete Square Roots

    题目描述: 在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根. 在模n意义下,非负整数x的离散平方根是满足0<=r<n且r2=x(mod n)的整数r. 解题思路: ...

  2. UVa 1426 Discrete Square Roots (扩展欧几里德)

    题意:给定 x,n,r,满足 r2 ≡ x mod(n) ,求在 0 ~ n 内满足 rr2 ≡ x mod(n) 的所有的 rr. 析:很明显直接是肯定不行了,复杂度太高了. r2 ≡ x mod( ...

  3. UVA 1426 - Discrete Square Roots(数论)

    UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...

  4. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)

    http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...

  5. UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

    题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...

  6. UVA 10090 Marbles 扩展欧几里得

    来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...

  7. POJ 1061 青蛙的约会 扩展欧几里得

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

  8. 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

    Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...

  9. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

随机推荐

  1. python常用模块——random模块

    参考博客:http://www.360doc.com/content/14/0430/11/16044571_373443266.shtml 今天突然想起python该怎么生成随机数?查了一下,贴出实 ...

  2. openstack ocata版(脚本)控制节点安装

    一.初始化环境: 1.更换yum源: yum install -y wget mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS- ...

  3. json教程系列(1)-使用json所要用到的jar包下载

    json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好的去研究一下json的底层实现,基于这样的认识,金丝燕网推出了一个关于json的系列教程,分析一下json的相关内容, ...

  4. linux输入子系统简述【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7678035 1,linux输入子系统简述 其实驱动这部分大多还是转载别人的,linux ...

  5. Kubernetes 待学习列表

    1.EFK or ELK https://blog.csdn.net/mawming/article/details/78344939, https://www.jianshu.com/p/fe3ac ...

  6. Entity Framework 7 动态 DbContext 模型缓存 ModelCaching

    EF7里实例化DbContext变的有点麻烦了, 下面这个基类会有所帮助: public abstract class BaseDbContext : DbContext { private stri ...

  7. PhotoShopCs5启动 需要使用Adobe Application Manager 启动试用版

    解决办法:下载Application Manager 7.0 地址:http://download.adobe.com/pub/adobe/creativesuite/cs/win/Applicati ...

  8. asp.net web api history and how does it work?

    https://blogs.msdn.microsoft.com/zxue/2012/11/07/what-is-asp-net-web-api-and-how-does-it-work/ https ...

  9. Qt QTreeWidget节点的添加+双击响应+删除详解

    转自: http://www.cnblogs.com/Romi/archive/2012/08/08/2628163.html 承接该文http://www.cnblogs.com/Romi/arch ...

  10. Python DB API 连接数据库

    Python DB API Mysql,Oracle,SqlServer 不关闭,会浪费资源.