bzoj 1406 数论
思路:
x ^ 2 = k*n + 1
x ^ 1 - 1 = k * n
(x + 1) * (x - 1) = k * n
我们设
x + 1 = n1 * k1
x - 1 = n2 * k2
n1 * n2 * k1 * k2 == k * n
我们只需要枚举n >= sqrt(n) 的 n 的约数 和 他们的倍数然后check就好啦。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int, int> using namespace std; const int N = 4e5 + 7; const int M = 1e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 +7; int n; set<int> ans; int main() { scanf("%d", &n); for(int i = 1; i * i <= n; i++) { if(n % i == 0) { int now = n / i; for(int j = now; j <= n; j += now) { if((j + 2) % (n / now) == 0) ans.insert(j + 1); if((j - 2) % (n / now) == 0) ans.insert(j - 1); } } } set<int> :: iterator it; if(!ans.size()) { puts("None"); } else { puts("1"); for(it = ans.begin(); it != ans.end(); it++) { if(*it >= 0 && *it < n) printf("%d\n", *it); } } return 0; } /* */