UVA 1426 - Discrete Square Roots

题目链接

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

思路:

r2≡x (mod n)=>r2+k1n=x

已知一个r!,带入两式相减得
r2−r12=kn
=> (r+r1)(rr1)=kn

枚举A,B,使得

A * B = n

(r + r1)为A倍数

(r - r1)为B倍数

这样就能够推出

Akar1=Bkb+r1=r

=> Aka=Bkb+2r1

=> Aka≡2r1 (mod B)

这样就等于求线性模方程的全部解。进而求出还有一解R。最后把全部答案用一个set保存下来输出

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <set>
using namespace std; long long X, N, R;
set<long long> 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<long long>::iterator it = ans.begin(); it != ans.end(); it++)
printf(" %lld", *it);
printf("\n");
}
return 0;
}

UVA 1426 - Discrete Square Roots(数论)的更多相关文章

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

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

  2. 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 < ...

  3. UVALive 4270 Discrete Square Roots

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

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

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

  5. UVA1426 Discrete Square Roots

    思路:\(exgcd\) 提交:\(2\)次 错因:输出格式错误OTZ 题解: 求:\(r^2 ≡ x \mod N , 0 \leq r < N\),并且题目会给出 \(x,N\) 和一个合法 ...

  6. uva 1426 离散平方根

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

  7. Square roots

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

  8. uva 11246 - K-Multiple Free set(数论)

    题目链接:uva 11246 - K-Multiple Free set 题目大意:给定n,k.求一个元素不大于n的子集,要求该子集的元素尽量多,而且不含两个数满足a∗k=b. 解题思路:容斥原理.f ...

  9. uva 11300 - Spreading the Wealth(数论)

    题目链接:uva 11300 - Spreading the Wealth 题目大意:有n个人坐在圆桌旁,每个人有一定的金币,金币的总数可以被n整除,现在每个人可以给左右的人一些金币,使得每个人手上的 ...

随机推荐

  1. Android 开发笔记___textview_聊天室效果

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  2. String类型

    String字符串的length属性返回的是该字符串里面16位字符的数量,如果字符串包含double-byte的字符,那么返回的数量可能不对   字符串一旦创建就修改不了 var lang = “Ja ...

  3. day3--深入学习命令总结

    1.查看命令帮助的几种方法 a.[命令] --help   适用于一般命令,非内置命令 b.man  [命令]     适用于一般命令,非内置命令 c.help  [命令]     适用于内置命令 d ...

  4. SQL系统函数的使用(实验五)

    SQL系统函数的使用(试验5) 函数在查询语句中的使用 查询员工的姓名和日工资(保留1位小数): 查询并显示部门号为01和02的所有员工的姓名首字及岗位: 查询并显示所有员工的姓名及工龄: 查询199 ...

  5. 清理win10过期补丁的命令

    作用是删除已经被新版本取代的旧系统文件 DISM.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase 注1: 执行后, 补丁就无法 ...

  6. stm32l053r8 nucelo板的串口实验

    stm32cubel0的HAL驱动实例中,基于stm32l53R8  nucelo板的官方串口通讯例程,是使用USART1实现在两块stm32l053r8 nucelo板间通讯.而在实际中,笔者手中只 ...

  7. spring配置文件一般结构

         xml schema:schema在文档根节点当中通过xmlns对文档当中的命名空间进行申明,第三行代码定义了默认命名空间用于spring bean的定义.xsi命名空间用于为每个文档中指定 ...

  8. mysql数据库第二弹

    mysql数据库针对表的操作 表记录的增删改查 1.增加一张表 插入记录之前必须得先有表结构! CREATE TABLE score( id int PRIMARY KEY auto_incremen ...

  9. Winform界面中主从表编辑界面的快速处理

    在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...

  10. Python中的九九乘法表(for循环)

    用for循环写出的九九乘法表(包括函数的调用) #方向一 for i in range(1,10):    for j in range(1,i+1):        d = i * j        ...