博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1406:[AHOI2007]密码箱(数论)
阅读量:7276 次
发布时间:2019-06-29

本文共 1398 字,大约阅读时间需要 4 分钟。

Description

在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示。经过艰苦的破译,小可可发现,这些图标表示一个数以及这个数与密码的关系。假设这个数是n,密码为x,那么可以得到如下表述: 密码x大于等于0,且小于n,而x的平方除以n,得到的余数为1。 小可可知道满足上述条件的x可能不止一个,所以一定要把所有满足条件的x计算出来,密码肯定就在其中。计算的过程是很艰苦的,你能否编写一个程序来帮助小可可呢?(题中x,n均为正整数)

Input

输入文件只有一行,且只有一个数字n(1<=n<=2,000,000,000)。

Output

你的程序需要找到所有满足前面所描述条件的x,如果不存在这样的x,你的程序只需输出一行“None”(引号不输出),否则请按照从小到大的顺序输出这些x,每行一个数。

Sample Input

12

Sample Output

1

5
7
11

Solution

$x^2=k\times n+1$

$(x+1)(x-1)=k \times n$

设$n=a\times b (a<b)$

$a \times b | (x+1)(x-1)$

$a|(x+1),b|(x-1)$或者$a|(x-1),b|(x+1)$。

枚举$n$的一个较大的质因数$b$的倍数,就可以将其看做$x-1$或$x+1$,然后代入到$a|(x+1)$或$a|(x-1)$里面验证一下就好了。记得去重。

$n=1$的时候问题无解(不过好像没有这种数据)

Code

1 #include
2 #include
3 #include
4 #define LL long long 5 using namespace std; 6 7 LL n; 8 set
s; 9 set
::iterator it;10 11 int main()12 {13 scanf("%lld",&n);14 if (n>1) s.insert(1);15 for (LL i=1; i*i<=n; ++i)16 {17 if (n%i) continue;18 LL x=n/i;19 for (LL j=x; j<=n; j+=x)20 {21 if (!((j-2)%i)) s.insert(j-1);22 if (!((j+2)%i)) s.insert(j+1);23 }24 }25 if (s.empty()) {puts("None"); return 0;}26 for (it=s.begin(); it!=s.end(); ++it)27 if (*it

转载于:https://www.cnblogs.com/refun/p/10100290.html

你可能感兴趣的文章
ASP.Net在web.config中设置上传文件的大小方法
查看>>
实战Kafka ACL机制
查看>>
视觉显著性顶尖论文总结
查看>>
Python 函数
查看>>
Spring事务的隔离级别
查看>>
java.lang.NoClassDefFoundError
查看>>
工作总结 管理NuGet 程序包 中 找不到 npoi 怎么办
查看>>
30岁前不必在乎的30件事
查看>>
.NET 3.5(1) - VS 2008新特性之Multi Targeting(多定向)
查看>>
sql操作归类百分比
查看>>
POJ 2584 T-Shirt Gumbo (Dinic 或 SAP)
查看>>
如何证明Application Domain的隔离性
查看>>
[Leetcode] Reverse Nodes in k-Group
查看>>
【Swift学习】Swift编程之旅(二)
查看>>
跨平台运行 Rafy 首次部署记录
查看>>
出问题时,双方各执一词,管理者应该怎么判断?
查看>>
Java学习路线之我见
查看>>
没想到你是这样的AWS
查看>>
天池大赛选手获哈佛Hackathon大奖 全球大赛现已正式启动
查看>>
送给物联网从业者:别犹豫了,为2019年的大变革做好准备吧!
查看>>