码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1406 密码箱

时间:2015-07-15 20:51:50      阅读:113      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!