HDU1719 Friend【数学规律】

题目链接:

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【数学规律】)