题目描述:

  在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根。

  在模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的更多相关文章

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

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

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

    UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...

  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. UVa 1426 Discrete Square Roots (扩展欧几里德)

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

  5. UVA1426 Discrete Square Roots

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

  6. Square roots

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

  7. UVALive 4867 Maximum Square 贪心

    E - Maximum Square Time Limit:4500MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  8. UVALive 7457 Discrete Logarithm Problem (暴力枚举)

    Discrete Logarithm Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/D Description ...

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

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

随机推荐

  1. mysql 客户端命令行下 直接查询并导出数据

    mysql原来还能这么导出数据,涨知识了. 方式1: select ....(sql语句) INTO OUTFILE   '/var/lib/mysql/msg_data.csv ' (导出的文件位置 ...

  2. Tickets---hdu1260(简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 题意是有n个人排队买票,第 i 个人买票所需要的时间是a[i],这个人和 i-1 或者 i+1 ...

  3. 9.Query on Embedded/Nested Documents-官方文档摘录

    1.插入案例 db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: & ...

  4. MySQL(多表的表记录的查询)

    一.外键约束 1.创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMAR ...

  5. sublime txet 3 python 开发环境安装配置

    下载python 下载地址:https://www.python.org/downloads/windows/ 下载sublime text 3 下载地址:https://www.sublimetex ...

  6. C++匿名命名空间

    当定义一个命名空间时,可以忽略这个命名空间的名称:      namespce {          char c;          int i;          double d;      } ...

  7. Python(函数的参数)

    函数参数的使用 def foo(x,y): pass foo(1,2) 形参:就是变量名 实参:就是变量值 形参:位置形参,默认参数,*args,命名关键字参数,**kwargs 实参: 按位置传值的 ...

  8. PHP 权限管理

    login页面 <form action="loginchuli.php" method="post"> <div>用户名:<in ...

  9. OpenOCD SWD调试stm32f0

    参考:http://www.stmcu.org.cn/module/forum/thread-610998-1-2.html

  10. 你真的会用javascript?

    偶然在csdn看到几个js的小题,考察的都是很基础的知识,拿来分享一下1. 1 2 3 4 if (!("a" in window)) { var a = 1; } alert(a ...