Problem Description
Friend number are defined recursively as follows.
(1) numbers 1 and 2 are friend number;
(2) if a and b are friend numbers, so is ab+a+b;
(3) only the numbers defined in (1) and (2) are friend number.
Now your task is to judge whether an integer is a friend number.
Input
There are several lines in input, each line has a nunnegative integer a, 0<=a<=2^30.
Output
For the number a on each line of the input, if a is a friend number, output “YES!”, otherwise output “NO!”.
Sample Input
Sample Output
friend numbers = 2^x + 3^y -1
解释:
变形可得到 x = ab+a+b+1 = (a+1)(b+1)
如果x为friend数,a,b一定得是friend数a就可以写成
a = a1b1+a1+b1-1 b = a2b2+a2+b2-1;就这样一直递推就
一开始只有1和2是朋友数。故可以得到一个规律:friend numbers + = 2^x + 3^y
#include <stdio.h>
int main(){
int n;
while(~scanf("%d", &n))
{
if(!n)
{
printf("NO!\n");
continue;
}
n+=1;
while(n%3==0 || n%2==0)
{
if(n%3==0) n/=3;
if(n%2==0) n/=2;
}
n==1?printf("YES!\n"):printf("NO!\n");
}
return 0;
}