题目描述:

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

  在模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. python2 打印菱形

    程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列. 程序源代码: #!/usr/bin/python # -*- coding: UT ...

  2. NPOI 操作office、word、excel

    下载地址为:http://npoi.codeplex.com/releases/view/616131 可以操作excel表,行,单元格内家及样式等.   使用示例:             usin ...

  3. 在启动MYSQL时出现问题:“ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)”

    1.问题描述 在启动MYSQL时出现问题:"ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)& ...

  4. PHP基础学习代码案例

    <?php print 'hello world ! '; echo '<br/>'; ?> <?php $number="16"; $number2 ...

  5. SQL联接 外联接 内联接 完全联接 交叉联接

    联接分为: 内联接                        [inner join] 外联接        (左外联接,右外联接)        [left join/left outer jo ...

  6. vue-cli中的build.js配置文件详细解析

    转载自:https://www.cnblogs.com/ye-hcj/p/7096341.html这是vue-cli脚手架工具的生产环境配置入口 package.json中的"build&q ...

  7. JAVA中字符串问题

    JAVA中对象创建 通过new关键字来创建对象 通过newInstance()方法来创建对象 使用反序列化机制中IO流中恢复Java对象 通过clone()方法复制一个对象 直接量方式,String ...

  8. $ 专治各种python字符编码问题疑难杂症

    标准动作 在脚本第一行指定编码格式: # coding:utf-8 将默认的ascii字符流处理方式变为utf-8: import sys sys.getdefaultencoding() 'asci ...

  9. MongoRepository动态代理及jpa方法解析源码分析

    public interface FzkRepository extends MongoRepository<Fzk, String> { Fzk findByName(String na ...

  10. http://blog.csdn.net/dancing_night/article/details/46698853

    http://blog.csdn.net/dancing_night/article/details/46698853