BZOJ 1406 密码箱

       大致看一下题目可以发现题目相当简单,似乎一个暴力就OK,但是一看数据范围没戏了,仔细进行一下分析发现这是一道数学题。题目的意思是:A²=kn+1,将之简单整理一下可以得到A²-1=kn,(A+1)*(A-1)=kn,这样看来由于A是整数,所以我们只需对kn进行因数分解,之后相信大家都知道了。

程序如下:

#include<iostream>
#include<cstdlib> 
#include<cstdio>
#include<set>
#include<cmath>
 
using namespace std;
 
set<int> ans;
 
int main()
{
    int n;
    scanf("%d", &n);
   
    if(n > 1) ans.insert(1);
    int m = (int)(sqrt(n) + 0.5);
    for(int i = 1; i <= m; i++) if(n % i == 0)
    {
        int j = n / i;
        for(int k = j; k <= n; k+=j)
        {
            if((k-2) % i == 0)  ans.insert(k-1);
            if((k+2) % i == 0)  ans.insert(k+1);
        }
    }
    for(set<int>::iterator it = ans.begin(); it != ans.end(); it++)
    {
        if((*it) < n) printf("%d\n", *it);
    }
    
    return 0;
}

你可能感兴趣的:(ZOJ)