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

HDU1719 Friend【数学规律】

时间:2015-03-30 13:25:32      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1719


题目大意:

我们来递归定义一个友好数:

(1)整数1、2是友好数

(2)如果a和b是友好数,那么a*b + a + b也是友好数

(3)只有用(1)和(2)定义的数是友好数。

现在给你一个数n(0 <= n <= 30),判断n是否是友好数


思路:

挺有意思的一道简单数学题。设n是一个友好数,那么n就可以分解为:

n = a*b + a + b = (a+1)*(b+1) - 1,即n+1 = (a+1)*(b+1)由递归定义,这里的a和b也必须是友好数。

a = a1*b1 + a1 + b1 = (a1+1)*(b1+1) - 1,即a + 1 = (a1+1)*(b1+1),同理b + 1 = (a2+1)*(b2+1)。

代入n + 1 = (a+1)*(b+1)中得到:n + 1 = (a1+1)*(b1+1)*(a2+1)*(b2+1)。而且如果只要ai和bi都不

为1或2,就可以一直分解下去。最终得到n + 1 = (1 + 1)^x * (2 + 1)^y = 2^x * 3^y。

这样就很好做了,先将n加上1,然后将所有2的素因子和3的素因子全部消去,如果消去因子后得到结果为

1,则说明n+1中只含有2和3的因子,则n为友好数。如果消去因子后结果部位1,即n中还含有其他因子,

则n不为友好数。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int n;
    //solve();
    while(~scanf("%d",&n))
    {
        if(n == 0)
        {
            printf("NO!\n");
            continue;
        }
        n++;
        while(n % 2 == 0)
            n /= 2;
        while(n % 3 == 0)
            n /= 3;
        if(n == 1)
            printf("YES!\n");
        else
            printf("NO!\n");

    }

    return 0;
}



HDU1719 Friend【数学规律】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/44748273

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!