思路:\(exgcd\)

提交:\(2\)次

错因:输出格式错误OTZ

题解:

求:\(r^2 ≡ x \mod N , 0 \leq r < N\),并且题目会给出 \(x,N\) 和一个合法的\(r_0\)。

原式可以转化为 \(r^2-r_0^2\equiv 0 \mod N\)

即 \((r+r_0)*(r-r_0) \equiv 0 \mod N\)

可以得到 \((r + r_0)*(r - r_0) = k * n\)

假设 \(n = a * b\),

那么 可以知道

\((r + r_0) \% a == 0\ \&\&\ (r - r_0) \% b == 0\ ||\\ (r + r_0) \% b == 0 \ \&\&\ (r - r_0) \% a == 0,\)

也就是

\(r + r_0 = k1 * a\)

\(r - r_0 = k2 * b\)

\(k1 * a + k2 * b = 2 * r_0\)

于是枚举约数,\(exgcd\),然后答案扔到\(set\)里正好排序\(+\)去重。

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<set>
#define ll long long
#define rr register ll
#define R register int
using namespace std;
namespace Luitaryi {
template<class I> inline I g(I& x) { x=0; register I f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;
}
inline ll exgcd(int a,int b,ll& x,ll& y) {
if(!b) {x=1,y=0; return a;}
rr d=exgcd(b,a%b,y,x); y-=a/b*x; return d;
} int T; ll n,m,r0;
set<ll> s;
inline void solve(int a,int b,int c) {
rr x,y; rr d=exgcd(a,b,x,y); if(c%d) return ;
rr tmp,der=abs(b/d); x*=c/d; x=(x%der+der)%der; y=x; while(1) {
tmp=a*x-r0; if(tmp>=0) {
if(tmp>=n) break; s.insert(tmp);
} x+=der;
} x=y; while(1) {
tmp=a*x-r0; if(tmp<=n) {
if(tmp<0) break; s.insert(tmp);
} x-=der;
}
}
inline void main() {
while(g(m),g(n),g(r0),m||n||r0) {
s.clear(); s.insert(r0);
for(R i=1;i<=sqrt(n);++i) {
if(n%i==0) solve(i,n/i,2*r0),solve(n/i,i,2*r0);
} printf("Case %d:",++T);
for(set<ll>::iterator it=s.begin();it!=s.end();++it) printf(" %lld",*it); puts("");
}
}
} signed main() {Luitaryi::main(); return 0;}

2019.08.23

77

UVA1426 Discrete Square Roots的更多相关文章

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

    UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < 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. Discrete Square Roots UVALive - 4270(拓展欧几里得)

    a≡b(mod n)的含义是“a和b除以n的余数相同”,其充要条件是“a-b是n的整数倍”: 求所有满足条件r^2=x(mod m)的r 题目已经给定了一个初始的r,x,m #include < ...

  4. UVALive 4270 Discrete Square Roots

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

  5. UVALive - 4270 Discrete Square Roots (扩展欧几里得)

    给出一组正整数$x,n,r$,使得$r^2\equiv x(mod\: n)$,求出所有满足该等式的$r$. 假设有另一个解$r'$满足条件,则有$r^2-r'^2=kn$ 因式分解,得$(r+r') ...

  6. Square roots

    Loops are often used in programs that compute numerical results by starting with an approximate answ ...

  7. 欧拉工程第64题:Odd period square roots

    题目链接 找循环位数是奇数的数有多少个 这个自己很难写出来,完全不能暴力 维基百科链接 维基百科上面说的很好,上面的算法实现就好了. 就是上面的 Java程序: package project61; ...

  8. [MIT6.006] 12. Square Roots, Newton's Method 平方根,牛顿法

    首先让我们回顾下上节课讲的,用牛顿法计算√2的内容: 简单来说,牛顿法从x0=1不断向后计算逼近√2的值,而刚开始计算的精度是1,随着牛顿法的逼近(共log2d个循环),就能使得√2逼近值的精度达到d ...

  9. uva 1426 离散平方根

    1426 - Discrete Square Roots Time limit: 3.000 seconds A square root of a number x <tex2html_verb ...

随机推荐

  1. Win10 自定义鼠标右键菜单

    1. 点击文件鼠标右键显示软件 1.1 步骤 win+R输入regedit进入注册表 定位到HKEY_CLASSES_ROOT\*\shell下 在shell创建一个你想要的右键文件 例如:Kinok ...

  2. PHP中类成员的访问控制

    类成员访问控制: 1.public 默认的,任何地方都可以访问,类内,类外,子类中 2.protected 受保护的,对外是封闭的,但是类内部和子类可以访问 3.private  私有的,仅限于本类中 ...

  3. 1190: 零起点学算法97——A == B ?(Java)

    WUSTOJ 1190: 零起点学算法97--A == B ? Description Give you two integer numbers A and B, if A is equal to B ...

  4. CAS 5.x搭建常见问题系列(2).PKIX path building failed

    错误原因 服务端的证书是不安全的,Cas的客户端在调用时因为安全提醒造成调用失败. CAS的客户端需要导入服务端的证书后,就正常了. 具体操作步骤如下: 1. 首先启动tomcat,看下之前搭建的ca ...

  5. (十四)Hibernate中的多表操作(4):单向一对一

    案例一: 注解方式实现一对一 UserBean.java package bean; import java.io.Serializable; import javax.persistence.Col ...

  6. (六)Struts的简单异常处理

    一.异常的分类 1.1 struts中的异常概念 Struts的声明式异常: 不处理异常,将异常交给struts框架来处理. 1.2 局部异常 局部异常:异常定义在Action里,异常处理只在这个Ac ...

  7. 【转载】使用appium遇到的坑

    问题 1. error: Failed to start an Appium session, err was: Error: Requested a new session but one was ...

  8. java8新特性的介绍

    什么是Stream Stream是一个来自数据源的元素队列并可以进行聚合操作.  数据源:流的来源. 可以是集合,数组,I/O channel, 产生器generator 等  聚合操作:类似SQL语 ...

  9. opencv-01--图像的遍历

    遍历图像的4种方式 一.at<typename>(i,j) Mat类提供了一个at的方法用于取得图像上的点,它是一个模板函数,可以取到任何类型的图像上的点.下面我们通过一个图像处理中的实际 ...

  10. A*算法与8数字谜题(参见《算法》P226习题2.5.32)

    A*算法的目的是找到一条从起始状态到最终状态的最短路径. 在A*算法中,需要在每个点计算启发函数:f(S) = g(S) + h(S),其中g(S)是从起点到S点的距离,h(S)是对从S点到终点的最短 ...