HYSBZ 1406 密码箱【数学】

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

Analyse:

x^2=k*n+1 -> x^2-1=kn

(x-1)(x+1)=kn->  (x-1)(x+1)=(k1*n1)*(k2*n2); && k1*k2==k; n1*n2==n;

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

typedef long long LL;
const int N=100007;

int main()
{
    LL n;
    while(scanf("%lld",&n)==1)
    {
        LL b;
        set<LL> ans;
        for(LL i=1;i*i<=n;i++){
            if(n%i) continue;
            b=n/i;
            for(LL j=1;j<n;j+=b){
                if((j+1)%i==0)
                    ans.insert(j);
            }
            for(LL j=b-1;j<n;j+=b){
                if((j-1)%i==0)
                    ans.insert(j);
            }
        }
        set<LL>::iterator it;
        if(!ans.size())
            printf("None\n");
        else{
            for(it=ans.begin();it!=ans.end();it++)
                printf("%lld\n",*it);
        }
    }

    return 0;
}
时间: 2024-10-10 12:31:38

HYSBZ 1406 密码箱【数学】的相关文章

HYSBZ 1406 密码箱

1406: [AHOI2007]密码箱 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 670  Solved: 376 [Submit][Status] Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示.经过艰苦的破译,小可可发现,这些图标表示一个数以及这个数与密码的关系.假设这个数是n,密码为x,那么可以得到如下表述:

BZOJ 1406 密码箱

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>

BZOJ 1406 密码箱(数论)

很简洁的题目.求出x^2%n=1的所有x<=n的值. n<=2e9. 直接枚举x一定是超时的. 看看能不能化成有性质的式子. 有 (x+1)(x-1)%n==0,设n=a*b,那么一定有x+1=k1a,x-1=k2b. 不妨设a<=b.那么就能O(sqrt(n))枚举a. 然后再枚举x,验证x是否满足这两个式子.注意不能令x=k1a-1.由于a比较小,枚举x=k2b+1,k2b-1即可. 另外set很好用啊. # include <cstdio> # include <

bzoj 1406: [AHOI2007]密码箱 二次剩餘

1406: [AHOI2007]密码箱 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 701  Solved: 396[Submit][Status] Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示.经过艰苦的破译,小可可发现,这些图标表示一个数以及这个数与密码的关系.假设这个数是n,密码为x,那么可以得到如下表述: 密码

BZOJ 1406: [AHOI2007]密码箱

二次联通门 : BZOJ 1406: [AHOI2007]密码箱 /* BZOJ 1406: [AHOI2007]密码箱 数论 要求 x^2 ≡ 1 (mod n) 可以转换为 x ^ 2 - k *n = 1 (x + 1) * (x - 1) = k * n 设 n = a * b 则 a * b | (x + 1) * (x - 1) 那么枚举b即可 */ #include <cstdio> #include <cmath> #include <set> type

【BZOJ】【1406】【AHOI2007】密码箱

数论 Orz iwtwiioi 果然数论很捉鸡>_>完全不知道怎么下手 $$x^2 \equiv 1 \pmod n \rightarrow (x+1)*(x-1)=k*n $$ 所以,我们得到$$n | (x+1)(x-1)$$ 那么有什么用呢?注意到整除是个神奇的关系= =所以我们可以令$n=a*b$,那么对于每个x,一定有$a|(x+1) 且 b|(x-1)$ 或是 $a|(x-1) 且 b|(x+1)$ 然后?我们可以$O(\sqrt{n})$枚举a,得到b,然而,x+1(或者x-1)

1406: [AHOI2007]密码箱

1406: [AHOI2007]密码箱 https://www.lydsy.com/JudgeOnline/problem.php?id=1406 分析 $x^2 ≡ 1 \ mod\ n$$x^2 = kn +1$$x^2 - 1 = kn$$(x + 1) ( x - 1) = kn$设$n = a \times b$$(x + 1) ( x - 1) = k \times a \times b$那么有$a | (x+1) , b|(x-1)$$a | (x-1) , b|(x+1)$ 所以

BZOJ 1406 [AHOI2007]密码箱 数论

题意:链接 方法:数论 解析: 对于这道题,假设n=a*b;然后b是较大的因子 之后怎么来想呢? 之后就是根号找因子,找到每个a,b,之后从0~n枚举b的倍数. 因为x2?1=0(mod n) 所以(x?1)?(x+1)=0(mod n) 因为我们枚举的数就是k1*b,所以我们只要讨论一下,k1*b是等于x-1还是x+1就好了,之后就是判断下边界什么的就把所有的可能值加到一个set里!千万不要犯傻加到map里!!千万不要!!不要认为map啥都能干!! 之后因为set内元素的唯一性.直接输出内部所

【BZOJ】1406: [AHOI2007]密码箱

题意:求$0<=x<n, 1<=n<=2,000,000,000, 且x^2 \equiv \pmod{n}$的所有$x$ #include <bits/stdc++.h> using namespace std; typedef long long ll; set<ll> s; int main() { ll n; scanf("%lld", &n); for(int i=1; i*i<=n; ++i) if(n%i==0