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>
using namespace std;
const int maxn = 100000 + 10;

int res[maxn];
int n,m,cnt;
long long t,j;

int main() {
    cin >> n;  cnt=0;
    if(n==1) {printf("None\n"); return 0;}
    m=(int) sqrt(n+0.5);
    for(int i=1;i<=m;i++) if(n%i==0) {
        j=n/i;
        for(t=j;t<=n;t+=j) {
            if((t-2)%i==0) res[++cnt]=(t-1)%n;
            if((t+2)%i==0) res[++cnt]=(t+1)%n;
        }
    }
    sort(res+1,res+cnt+1);
    for(int i=1;i<=cnt;i++) if(res[i]!=res[i-1]) printf("%d\n",res[i]);
    return 0;
}
时间: 2024-12-20 08:28:52

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

[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中

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】密码箱 约数 + 乱搞 + set?

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

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

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

HYSBZ 1406 密码箱

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