标签:
题目链接:
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; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/44748273