题目链接

题意 : 给你一个同余方程, x*x ≡ x  (mod n),让你求出所有的小于n的x。

思路 :

先来看同余的概念 :给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即m|(a-b),那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。

因此题目中给定的式子可以写成:(x*x-x)/n=k.也就是说(x*x-x)是n的整数倍,取余n是0.

因为n=p*q,而且gcd(p,q)=1 ;所以上式可以写为,x*(x-1)/(p*q)=k.

让我们分情况讨论:

上式中,

  1. 当k=0时,要么x为0,要么x-1为0,所以,两个解已经出来了,0和1。
  2. 当k!=0时,要么p是x的因数并且q是x-1的因数,要么q是x的因数,p是x-1的因数。因此,这种情况下只要求出两种情况的p和q,然后再求他们的倍数。

x是不可能同时存在p和q两个因子的,因为这样就大于n了。

对于第1种情况,设x是p的a倍,x-1是q的b倍,则p*a-q*b=1.也就是说,因为gcd(p,q)=1,所以p*a-q*b=gcd(p,q).

让我们再来看扩展欧几里得 : 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在)。

所以用扩展欧几里得将p*a-q*b=gcd(p,q).这个式子里的a求出来,然后乘上枚举出来的p。就是x的又一个解。最后再求第二种情况下的a即可。

#include <stdio.h>
#include <iostream> using namespace std ; void exGcd(int a,int b,int& x,int& y)
{
if(b == )
{
x = ;
y = ;
return ;
//return a;
}
exGcd(b,a%b,x,y);
int t = x ;
x = y ;
y = t - a / b * y ;
// return r;
}
bool isprime(int x)
{
for(int i = ; i * i < x ; i++)
{
if(x % i == )
return false;
}
return true ;
}
int main()
{
int T,n,p,q,x,y ;
scanf("%d",&T) ;
while(T--)
{
scanf("%d",&n) ;
for(int i = ; i * i < n ; i++)
{
if( (n%i == ) && isprime(i) && isprime(n/i) )
{
p = i ;
q = n/i ;
break ;
}
}
exGcd(p,q,x,y) ;
int ans1 = p*x < ? p*x+n : p*x ;
exGcd(q,p,x,y) ;
int ans2 = q*x < ? q*x+n : q*x ;
if(ans1 > ans2)
swap(ans1,ans2) ;
printf("0 1 %d %d\n",ans1,ans2) ;
}
return ;
}

URAL 1204. Idempotents (扩展欧几里得)的更多相关文章

  1. URAL1204. Idempotents(扩展欧几里得)

    1204 大体推推 会出来这个式子 x(x-1) = k*n;n = p*q ;x(x-1)%(p*q)==0; 因为p,q都为素数 那也就是说x和x-1中必定包含这两个数 而且一个里面只能有一个 不 ...

  2. URAL 1141. RSA Attack(欧拉定理+扩展欧几里得+快速幂模)

    题目链接 题意 : 给你n,e,c,并且知道me ≡ c (mod n),而且n = p*q,pq都为素数. 思路 : 这道题的确与题目名字很相符,是个RSA算法,目前地球上最重要的加密算法.RSA算 ...

  3. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)

    http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...

  4. UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

    题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...

  5. UVA 10090 Marbles 扩展欧几里得

    来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...

  6. POJ 1061 青蛙的约会 扩展欧几里得

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

  7. 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

    Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...

  8. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

  9. poj 2142 扩展欧几里得解ax+by=c

    原题实际上就是求方程a*x+b*y=d的一个特解,要求这个特解满足|x|+|y|最小 套模式+一点YY就行了 总结一下这类问题的解法: 对于方程ax+by=c 设tm=gcd(a,b) 先用扩展欧几里 ...

随机推荐

  1. Linux修改数据库的访问权限

    以下方法可以帮助你解决这个问题了,下面的语句功能是,建立一个用户为monitor密码admin权限为和root一样.允许任意主机连接.这样你可以方便进行在本地远程操作数据库了. CREATE USER ...

  2. Maven项目中突然找不到Build Path或maven dependencies library

    这两天发现有个maven项目抽风了,一个是右击项目找不到Build Path了,一个是依赖的lib库没了,maven引入的依赖包导不了.后来发现是eclipse搞的鬼,出问题的是项目下的.classp ...

  3. 在android开发中添加外挂字体

    1.在项目目录中,右键app——New——Folder—— Assets Folder 2.把.ttf或者.oft文件拷进这个assets文件夹 3.在onCreate()中 Typeface typ ...

  4. 开学初的c

    cout<<a[i]<<" " 这个是先输出a[i]再输出空格 cout<<endl      这个是直接换行cout<<a[i]& ...

  5. 学习FPGA有必要写SDRAM控制器吗?

    在学习FPGA的过程中,注意是在学习过程中,联系FPGA的使用技巧,强烈建议尝试设计一个SDRAM控制器,不要使用IP核. 学习SDRAM控制器设计,能让你掌握很多知识. 更好的使用状态机去精准控制时 ...

  6. mac 在终端使用命令行启动脚本,无法使用自己安装的python去执行脚本问题

    参考了2片文章: //查看python位置 which python //先备份 1.sudo cp /usr/bin/python /usr/bin/python_cp //删除 2.sudo rm ...

  7. 特别注意: range.Text.ToString(); 和 range.Value2.ToString(); 的区别

    如果Excell的单元格里面是日期,前面显示2015年05月10日:后面的显示42134 也就是说:Text 和Value2的不同. using System; using System.Data; ...

  8. delphi 在桌面屏幕上模拟鼠标单击

    delphi 在桌面屏幕上模拟鼠标单击 procedure TFrmUnicom.Button1Click(Sender: TObject); var oldPoint, newPoint: TPoi ...

  9. Oracle11gR2--SEC_CASE_SENSITIVE_LOGON参数解析

    在Oracle的11g之前的版本中密码是不区分大小写的(使用双引号强制除外). 在Oracle的11g以及以后的版本中对此有所增强.从此密码有了大小写的区分. 这个大小写敏感特性是通过SEC_CASE ...

  10. <转>Linux环境进程间通信--信号灯(四)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/ 一.信号灯概述 信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机 ...