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>
typedef long long LL;
#define Set std :: set <LL> 

int main ()
{
    LL N, a, b; scanf ("%lld", &N); register LL i, j;
    int L = sqrt (N); Set Answer;
    for (i = 1; i <= L; ++ i)
        if (N % i == 0)
        {
            a = i, b = N / i;
            for (j = 0; j <= N; j += b)
            {
                if ((j + 2) % a == 0 && j + 2 < N) Answer.insert (j + 1);
                   if ((j - 2) % a == 0 && j - 2 >= 0) Answer.insert (j - 1);
            }
        }
    if (Answer.size () == 0) return printf ("None"), 0;
    for (Set :: iterator i = Answer.begin (); i != Answer.end (); ++ i)
        printf ("%lld\n", *i);
    return 0;
}
时间: 2024-10-05 23:27:11

BZOJ 1406: [AHOI2007]密码箱的相关文章

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

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

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内元素的唯一性.直接输出内部所

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]密码箱

题意:求$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

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 <

[BZOJ1406][AHOI2007]密码箱(数论)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1406 分析: (x+1)(x-1)是n的倍数 于是可以把n分解成n=ab,则a为(x+1)约数且b为(x-1)约数 或者 a为(x-1)约数且b为(x+1)约数 于是1~sqrt(n)枚举因数,判断就行,如果某个x可以就加入到set中

bzoj1406: [AHOI2007]密码箱

数学. x^2 % n = 1 则 (x+1)(x-1) = kn. 设 x+1 = k1*n1, x-1=k2*n2. 则 k1*k2=k , n1*n2=n. 算出每个大于sqrt(n)的约数,然后分别作n1,n2尝试是否可行. 算x一定要取模.否则1会变成n+1. #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath>

【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)