首页 > 其他 > 详细

BZOJ 1406 密码箱

时间:2015-07-15 20:50:56      阅读:157      评论:0      收藏:0      [点我收藏+]

       大致看一下题目可以发现题目相当简单,似乎一个暴力就OK,但是一看数据范围没戏了,仔细进行一下分析发现这是一道数学题。题目的意思是:A2=kn+1,将之简单整理一下可以得到A2-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;
}

BZOJ 1406 密码箱

原文:http://www.cnblogs.com/szy-wlxy/p/4649388.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!