UVALive 4270 Discrete Square Roots
题目描述:
在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根。
在模n意义下,非负整数x的离散平方根是满足0<=r<n且r2=x(mod n)的整数r。
解题思路:
假设要求的一个离散平方根为r1,则有:
r2=x(mod n)
r12=x(mod n)
两式相减可得:
r2-r12=0(mod n)
即:
r2-r12=kn
令:
a*b=n
则有:
r-r1=0(mod a)
r+r1=0(mod b)
即:
r-r1=k1a
r+r1=k2b
两式相加可得:
k1a+k2b=2r
据此,枚举n的所有约数,得到所有可能的a和b。
再利用扩展欧几里得算法解出所有的k2,代入r-r1=k1a即可得到r1。
代码在这:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; set<ll> ans;
ll x,n,r; //扩展欧几里得算法
void gcd(ll a,ll b,ll& d,ll& x,ll& y)
{
if(b==)
{
d=a;
x=;
y=;
}
else
{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
} void solve(ll a,ll b)
{
ll k1,k2,d;
gcd(a,b,d,k1,k2); if(*r%d)
return; k2*=(*r/d); ll aa=a/d;
k2%=aa;//k2是所有形如k2+k*aa的整数,最小的k2对应最小的r1 ll r1=k2*b-r;
while(r1<n)
{
if(r1>=&&r1*r1%n==x)
ans.insert(r1); r1+=aa*b;
}
} int main()
{
int ca=;
while(~scanf("%lld%lld%lld",&x,&n,&r))
{
if(x==&&n==&&r==)
break; ans.clear(); for(ll i=;i*i<=n;i++)
if(n%i==)
{
solve(i,n/i);
solve(n/i,i);
} printf("Case %d: %lld",++ca,*ans.begin());
for(set<ll>::iterator it=ans.begin();it!=ans.end();it++)
if(it!=ans.begin())
printf(" %lld",*it);
printf("\n");
}
return ;
}
UVALive 4270 Discrete Square Roots的更多相关文章
- UVALive - 4270 Discrete Square Roots (扩展欧几里得)
给出一组正整数$x,n,r$,使得$r^2\equiv x(mod\: n)$,求出所有满足该等式的$r$. 假设有另一个解$r'$满足条件,则有$r^2-r'^2=kn$ 因式分解,得$(r+r') ...
- UVA 1426 - Discrete Square Roots(数论)
UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...
- 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 < ...
- UVa 1426 Discrete Square Roots (扩展欧几里德)
题意:给定 x,n,r,满足 r2 ≡ x mod(n) ,求在 0 ~ n 内满足 rr2 ≡ x mod(n) 的所有的 rr. 析:很明显直接是肯定不行了,复杂度太高了. r2 ≡ x mod( ...
- UVA1426 Discrete Square Roots
思路:\(exgcd\) 提交:\(2\)次 错因:输出格式错误OTZ 题解: 求:\(r^2 ≡ x \mod N , 0 \leq r < N\),并且题目会给出 \(x,N\) 和一个合法 ...
- Square roots
Loops are often used in programs that compute numerical results by starting with an approximate answ ...
- UVALive 4867 Maximum Square 贪心
E - Maximum Square Time Limit:4500MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- UVALive 7457 Discrete Logarithm Problem (暴力枚举)
Discrete Logarithm Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/D Description ...
- 欧拉工程第64题:Odd period square roots
题目链接 找循环位数是奇数的数有多少个 这个自己很难写出来,完全不能暴力 维基百科链接 维基百科上面说的很好,上面的算法实现就好了. 就是上面的 Java程序: package project61; ...
随机推荐
- 打印出所有的"水仙花数"
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...
- Making the Grade---poj3666(类似离散化+dp)
题目链接:http://poj.org/problem?id=3666 题意是给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价? ///用dp[i][j]表示 ...
- Java-idea-生成JavaDoc
1.选中要生成的doc模块 2.选择Tools→Generate JavaDoc 3.填写一下信息 1. 选择是整个项目还是模块还是单个文件 2. 文档输出路径 4. 传入JavaDoc的参数,一般这 ...
- rails timeout 异常
发现经常有”超时“的错误信息,如/usr/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill': execution expired (Timeout::Error),恩 ...
- Linux Shell编程第5章——文件的排序、合并和分割
目录 sort命令 sort命令的基本用法 uniq命令 join命令 cut命令 paste命令 split命令 tr命令 tar命令 sort命令 sort命令是Linux系统一种排序工具,它将输 ...
- Linux Shell编程第1章——Shell脚本编程概述
目录 Linux和Shell简介 Linux是一套可免费使用和自由传播的类UNIX操作系统.Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送 ...
- 在Windows上以服务方式运行 Redis
ServiceStack.Redis 使用教程里提到Redis最好还是部署到Linux下去,Windows只是用来 做开发环境,现在这个命题发生改变了,在Windows上也可以部署生产环境的Redis ...
- windows8系统安装MongoDB 2.6.3配置服务启动
转自:http://winfan.net/655.html 1. 下载mongodb包2. 解压zip至 D:\MongoDB3. 创建目录 D:\MongoDB\data\db4. 创建日志目录 D ...
- 利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)
Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley D ...
- iOS 多线程安全 与可变数组
完全来自于iOS 多线程安全与可变字典 的学习 基本相同,举一反三 直接上样例代码 是我参照网上,根据当前业务需求改的. 其实好多人在这里喜欢用类别处理.我个人觉得用类别 极其容易和普通方法混淆,所以 ...