题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1719
题意:1和2是friend num
a和b是friend num的话,a+b+a*b也是friend num
思路:a+b+a*b=(a+1)*(b+1)-1
a=c+d+c*d=(c+1)*(d+1)-1, b=e+f+ef=(e+1)*(f+1)-1
(a+1)*(b+1)-1=[(c+1)*(d+1)]*[(e+1)*(f+1)-1]-1;
一直重复拆分必定会变成[(1+1)^x]*[(2+1)^y]-1,因此N+1不断除以2和3直到无法被整除后判断是否为1便可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
if (n==1 || n==2)
{
printf("YES!\n");
}
else if (n==0)
{
printf("NO!\n");
}
else
{
n+=1;
while (n%3==0) n=n/3;
while (n%2==0) n=n/2;
//cout<<n<<endl;
if (n==1)
printf("YES!\n");
else
printf("NO!\n");
}
}
}