BZOJ 1406 密码箱

本文介绍了一个算法,用于解决给定整数n时找到所有满足x^2≡1(mod n)的x值。通过分解n为a*b的形式,并利用(x+1)和(x-1)分别对a和b取模的方法来寻找解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.lydsy.com/JudgeOnline/problem.php?id=1406

题意:给定n,求x^2==1%n

x^2-1=k*n

(x+1)*(x-1)==k*n

(x+1)(x-1)%n=0

n=a*b

则有(x+1)|a且(x-1)|b 或 (x-1)|a且(x+1)|b

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 #include<set>
 8 #define ll long long
 9 using namespace std;
10 int n;
11 set<int> ans;
12 int main(){
13     scanf("%d",&n);
14     int len=(int)sqrt(n);
15     ans.insert(1);
16     for (int i=1;i<=len;i++)
17      if (n%i==0){
18         int a=n/i,b=i,x;
19          for (x=a+1;x<=n;x+=a)
20           if ((x+1)%b==0) ans.insert(x);
21          for (x=a-1;x<=n;x+=a)
22          if ((x-1)%b==0) ans.insert(x);
23      }
24     for (set<int>::iterator i=ans.begin();i!=ans.end();i++) printf("%d\n",*i);
25 }

 

转载于:https://www.cnblogs.com/qzqzgfy/p/5581371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值