URAL 1204 Idempotents

扩展欧几里得

题意:
给你一个数n,输出所有符合条件的正整数x,其中n=pq,p和q是两个不同的质数
条件:x*x%n=x

数据范围:
样例数<=1000,n<=10^9

思路:

原本打算O(√n)卡过去的,但数据组数卡了我...

首先认为题目的模就是模运算而不是同余,这样的话,不存在x>=n的答案,因为x*x模了n之后的值不可能大于等于n,x也不会是负数,因为x*x是正的,模n得到的答案不会是负。然后下面还会证明答案就是固定四个

x*x%n=x,就是存在整数k使得,x*x=kn+x,再变形变成x(x-1)=kpq,这个式子就有意思了。去除x是0或1这些特殊情况,这个等式意味着x整除p,x-1整除q,或者x整除q,x-1整除p。

就第一种的情况分析,得到x=sp,x-1=tq(s和t是整数)。相减得sp-tq=1,扩展欧几里得!求出s和t之后,调整s(加q或减q)使得它满足0<=s<q,然后这时候的sp就是一个答案。

你可以发现这时候s向上调整会使得sp>=n,s向下调整会使sp是负数。因此这里有且只会贡献一个解,而另一个情况会贡献另一个解,加上0和1,一共4个解,不存在重复解

先打好了质数表再分解n,暴力分解应该会TLE

总结:把式子变形,然后扩展欧几里得,调整系数得出答案


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值