UVALive 4270 Discrete Square Roots
题目描述:
在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根。
在模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的更多相关文章
- UVALive - 4270 Discrete Square Roots (扩展欧几里得)
给出一组正整数$x,n,r$,使得$r^2\equiv x(mod\: n)$,求出所有满足该等式的$r$. 假设有另一个解$r'$满足条件,则有$r^2-r'^2=kn$ 因式分解,得$(r+r') ...
- UVA 1426 - Discrete Square Roots(数论)
UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...
- 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 < ...
- UVa 1426 Discrete Square Roots (扩展欧几里德)
题意:给定 x,n,r,满足 r2 ≡ x mod(n) ,求在 0 ~ n 内满足 rr2 ≡ x mod(n) 的所有的 rr. 析:很明显直接是肯定不行了,复杂度太高了. r2 ≡ x mod( ...
- UVA1426 Discrete Square Roots
思路:\(exgcd\) 提交:\(2\)次 错因:输出格式错误OTZ 题解: 求:\(r^2 ≡ x \mod N , 0 \leq r < N\),并且题目会给出 \(x,N\) 和一个合法 ...
- Square roots
Loops are often used in programs that compute numerical results by starting with an approximate answ ...
- UVALive 4867 Maximum Square 贪心
E - Maximum Square Time Limit:4500MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- UVALive 7457 Discrete Logarithm Problem (暴力枚举)
Discrete Logarithm Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/D Description ...
- 欧拉工程第64题:Odd period square roots
题目链接 找循环位数是奇数的数有多少个 这个自己很难写出来,完全不能暴力 维基百科链接 维基百科上面说的很好,上面的算法实现就好了. 就是上面的 Java程序: package project61; ...
随机推荐
- vue-cli注册全局组件
在main.js开头引入组件,然后注册组件,例如: import Vue from 'vue' import VueRouter from 'vue-router' import VueResourc ...
- selenium入门基础知识
内容转载自:http://blog.csdn.net/huangbowen521/article/details/7816538 1.selenium介绍: Selenium是一个浏览器自动化操作框架 ...
- 在Linux下查找文件内容包含某个特定字符串的文件
如何在Linux下查找文件内容包含某个特定字符串的文件? 我的目录下面有test1和test2两个文件夹,里面都含有很多文件,其中test2里面还包含一个test文件夹 我想请问的是,如何通过查找关键 ...
- android studio中取消关联git
Android studio取消关联Git 步骤如下 settings->version control 这里是已经取消关联的 如果关联 按住减号即可
- Angular学习笔记—RxJS与Observable(转载)
1. Observable与观察者模式的关系 其实这里讲的Observable就是一种观察者模式,只不过RxJS把Observable结合了迭代模式以及附件了很多的operator,让他变得很强大,也 ...
- 35个例子学会find
find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> - <指定目录>: 所要搜索的目录及其所有子目录.默认为当前目录. - ...
- uva 11752 The Super Powers (数论+枚举)
题意:找出1~2^64-1中 能写成至少两个数的幂形式的数,再按顺序输出 分析:只有幂是合数的数才是符合要求的.而幂不会超过64,预处理出64以内的合数. 因为最小的合数是4,所以枚举的上限是2的16 ...
- Loadrunner场景设计篇——负载生成器
1 简介 当执行一个场景时,Controller把场景中的每个用户配到负载生成器(Load generator). 所谓的负载生成器(Load Generator)就是执行Vuser脚本,运行Vus ...
- hadoop07---synchronized,lock
synchronized 锁是jvm控制的,控制锁住的代码块只能有一个线程进入.线程执行完了锁自动释放,抛出异常jvm会释放锁. synchronized的缺陷 1.如果一个线程被阻塞了,其余的线程 ...
- P4949 最短距离(基环树+树链剖分)
题目 P4949 最短距离 做法 先把非树边提出来 查询\((x,y)\)的最短距离就分类查询:树上\((x,y)\)距离,经过非树边距离 带边权查询链长,一个烂大街的套路:树链剖分,节点维护树边距离 ...