博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1426 - Discrete Square Roots(数论)
阅读量:7096 次
发布时间:2019-06-28

本文共 1390 字,大约阅读时间需要 4 分钟。

UVA 1426 - Discrete Square Roots

题意:给定X, N。 R。要求r2x (mod n) (1 <= r < n)的全部解。R为一个已知解

思路:

r2x (mod n)=>r2+k1n=x
已知一个r!,带入两式相减得 r2r12=kn => (r+r1)(rr1)=kn
枚举A,B,使得
A * B = n
(r + r1)为A倍数
(r - r1)为B倍数
这样就能够推出
Akar1=Bkb+r1=r
=> Aka=Bkb+2r1
=> Aka2r1 (mod B)
这样就等于求线性模方程的全部解。进而求出还有一解R。最后把全部答案用一个set保存下来输出

代码:

#include 
#include
#include
#include
using namespace std;long long X, N, R;set
ans;long long exgcd(long long a, long long b, long long &x, long long &y) { if (!b) {x = 1; y = 0; return a;} long long d = exgcd(b, a % b, y, x); y -= a / b * x; return d;}void mod_line(long long a, long long b, long long n) { long long x, y; long long d = exgcd(a, n, x, y); if (b % d) return; x = x * (b / d); x = (x % (n / d) + (n / d)) % (n / d); long long a0 = x * a - b / 2; long long k = a * n / d; for (long long tmp = a0; tmp < N; tmp += k) { if (tmp >= 0) ans.insert(tmp); }}int main() { int cas = 0; while (~scanf("%lld%lld%lld", &X, &N, &R) && N) { ans.clear(); long long m = (long long)sqrt(N); for (long long i = 1; i <= m; i++) { if (N % i) continue; mod_line(i, 2 * R, N / i); mod_line(N / i, 2 * R, i); } printf("Case %d:", ++cas); for (set
::iterator it = ans.begin(); it != ans.end(); it++) printf(" %lld", *it); printf("\n"); } return 0;}

转载地址:http://gaxql.baihongyu.com/

你可能感兴趣的文章
Redis在windows下的安装使用
查看>>
strstr、stristr、strpos这三个函数的区别
查看>>
cxf 发布服务
查看>>
TensorFlow 简单使用
查看>>
SELinux 简介
查看>>
java cookie操作实现免登陆
查看>>
Chrome and Firefox Diffie-Hellman Fix
查看>>
Greenplum 部署简介
查看>>
oracle oem web页面 按钮乱码
查看>>
mysql必知必会——GROUP BY和HAVING
查看>>
初学Hibernate(二)配置文件常用属性和一个实例
查看>>
PHP页面显示图片(gif,jpg,png)
查看>>
Java Streams,第 3 部分: Streams 的幕后原理
查看>>
快速排序
查看>>
记录专用
查看>>
基本表单的开发
查看>>
SNMPTRAP方式
查看>>
找回 macOS 10.12 Sierra 安全性与隐私的设置中
查看>>
字符串匹配
查看>>
JAVASCRIPT中数字字符串比较大小
查看>>