题目链接

题意 : 给你一个同余方程, 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. Python 函数 -slice()

    功能: slice() 函数实现切片对象,主要用在切片操作函数里的参数传递.返回一个切片对象. 语法: class slice(stop) class slice(start, stop[, step ...

  2. FastAdmin + uni-app

    FastAdmin + uni-app FastAdmin https://www.FastAdmin.net uni-app http://uniapp.dcloud.io/ 自己先挖个坑.

  3. 自动工作负载库理论与操作(Automatic Workload Repository,AWR)

    AWR的由来:    10g之前的oracle:用户的连接将产生会话,当前会话记录保存在v$session中:处于等待状态的会话会被复制一份放在v$session_wait中.当该连接 断开后,其原来 ...

  4. mysql 存储过程 事务处理 (转)

    BEGIN DECLARE t_error INTEGER DEFAULT 0;  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; S ...

  5. 16.Selenium+Python关于句柄的小Demo

    前言:有些链接点击之后,会重新打开一个窗口,对于这种情况,就要切换窗口了,获得窗口的唯一标识是用句柄(handle) 代码如下所示: from selenium import webdriver dr ...

  6. 生产环境连接数据库失败:Cannot create PoolableConnectionFactory❨Got mins one from a read call❩

    生产环境发现有接口调不通,而且集中在两个节点,其他节点都没问题.抓取日志发现报错如下: Context initialization failed. org.springframework. bean ...

  7. go基本数据类型与运算符

    GO基本类型1.布尔(bool) 长度:1字节 取值范围:true,false 注意事项:不可用数字代表true或false2.整型(int/uint) 根据平台 肯能为32位或64位3. 8位整型: ...

  8. (转)Oracle存储过程中的事务

    本文转载自:http://www.cnblogs.com/linjiqin/archive/2011/04/18/2019990.html 1.事务用于确保数据的一致性,由一组相关的DML语句组成,该 ...

  9. nodejs 中的 NODE_PATH

    在使用 nodejs 开发中我们都免不了要去安装一些第三方模块. 那么你或多或少的遇到过以下一些问题 再继续阅读之前,我们先来弄清楚一个概念. npm install --global xxx 属于全 ...

  10. oracle里的查询转换

    oracle里的查询转换的作用 Oracle里的查询转换,有称为查询改写,指oracle在执行目标sql时可能会做等价改写,目的是为了更高效的执行目标sql 在10g及其以后的版本中,oracle会对 ...