UVALive - 4270 Discrete Square Roots (扩展欧几里得)
给出一组正整数$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 (扩展欧几里得)的更多相关文章
- UVALive 4270 Discrete Square Roots
题目描述: 在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根. 在模n意义下,非负整数x的离散平方根是满足0<=r<n且r2=x(mod n)的整数r. 解题思路: ...
- UVa 1426 Discrete Square Roots (扩展欧几里德)
题意:给定 x,n,r,满足 r2 ≡ x mod(n) ,求在 0 ~ n 内满足 rr2 ≡ x mod(n) 的所有的 rr. 析:很明显直接是肯定不行了,复杂度太高了. r2 ≡ x mod( ...
- UVA 1426 - Discrete Square Roots(数论)
UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...
- 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个点,求射 ...
- 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- ...
- UVA 10090 Marbles 扩展欧几里得
来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...
- POJ 1061 青蛙的约会 扩展欧几里得
扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...
- 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】
Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...
- poj 2891 扩展欧几里得迭代解同余方程组
Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...
随机推荐
- win7下配置JAVA环境变量
首先安装JDK,jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008 找到安装目录,并记下,D:\Program Files (x86)\Java\jdk1. ...
- Android Integer.parseInt java.lang.NumberFormatException: Invalid int解决方法
解决方法: http获取的字符串minutes去空字符串处理minutes.replaceAll("\\D+","").replaceAll("\r& ...
- mongodb简单用法
修改器: $inc: 增加已有的键值,如果键值不存在就创建一个 数据库中存在这样的数据:{ , "url": "www.example.com", }db.fz ...
- 给二维码(图片)添加文字(水印),让生成的二维码中间带logo
<?php //生成二维码 require_once IA_ROOT . '/framework/library/qrcode/phpqrcode.php'; QRcode::png($url, ...
- Qt浅谈之二十六图片滑动效果
一.简介 博客中发现有作者写的仿360的代码,觉得其中图片滑动的效果很有意思,特提取其中的代码.并加上类似mac的画面移动的动画效果. 二.详解 1.代码一:界面滑动(QWidget) (1)slid ...
- linux环境vim升级到vim74
作为编辑器之神,vim7.4已经发布近两个月了.从vim7.3到vim7.4,时隔两年之久,做了多项改正和性能提升,作为Linux Geeksters的你,怎能错过. 由于各大主流linux操作系统都 ...
- SpringBoot 入门笔记
1. Spring 4.3中引入了: @GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping 2. @RequestMapp ...
- JAVA获取webapp路径
1.使用ServletContext获取webapp目录 在Servlet中 String path = getServletContext().getRealPath("/"); ...
- MYSQL数据库字段命名及设计规范
1.设计原则 1) 标准化和规范化数据的标准化有助于消除数据库中的数据冗余.标准化有好几种形式,但 Third Normal Form(3NF)通常被认为在性能.扩展性和数据完整性方面达到了最好平衡. ...
- mac下安装py第三方库到python3下
python3 -m pip install **** 中间可能碰到超时问题 python3 pip --default-timeout=100 install -U **** 设置默认超时时间即可 ...