题目描述:

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

  在模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. 事件对象event之e.targtet || e.srcElement

    p.onclick = function (event) { var e = event || window.event, target = e.target ? e.target : e.srcEl ...

  2. hadoop编程:分析CSDN注冊邮箱分布情况

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jdh99/article/details/37565825 hadoop编程:分析CSDN注冊邮箱分 ...

  3. Ubuntu 13.04安装mysql workbench

    1.如果你没有更换源,是主服务器的官网源,这时候你可以直接用sudo apt-get install mysql-workbench来安装(前提是已经装好mysql相关服务) 2.如果你第一条装不了, ...

  4. 人性化的Form(django)

    django中的Form一般有两种功能: 输入html 验证用户输入 html: <!DOCTYPE html> <html lang="en"> < ...

  5. python全栈开发之OS模块的总结

    OS模块 1. os.name()      获取当前的系统 2.os.getcwd      #获取当前的工作目录 import os cwd=os.getcwd() # dir=os.listdi ...

  6. Mootools遮罩层练习(原为网上的jquery写法)

    <html > <head> <meta charset="utf-8" /> <title>mootools 遮罩层</ti ...

  7. 解释一下python中的关系运算符

    关系运算符用于比较两个值 1.小于号,如果左边的值较小,则返回Trueprint('hi'<'Hi')#False 2.大于号,如果左边的值较大,则返回Trueprint(1.1+2.2> ...

  8. java基础知识框图

  9. Shiro理解与总结

    Feature Apache Shiro is a comprehensive application security framework with many features. The follo ...

  10. POJ - 1904 King's Quest (强连通)

    题意:有N个王子,每个王子有任意个喜欢的妹子,巫师会给出一个方案:每个妹子都嫁给一个王子.但是国王希望知道:每个王子能在哪些妹子中择偶而不影响其他王子择偶. 分析:设王子为x部,妹子为y部,假设有匹配 ...