Friend HDU杭电1719 【规律题】

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
   
   
   
   
3 13121 12131

Sample Output
   
   
   
   
YES! YES! NO!


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;
}


你可能感兴趣的:(Friend HDU杭电1719 【规律题】)