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;
}


/*

*/

 

posted @ 2018-07-12 21:04  NotNight  阅读(131)  评论(0编辑  收藏  举报