(周日赛1)Friend

自己尝试推 但是没有推出来 太不机智了!后来提交的时候还忘记加‘!’ wa了好几次也没发现=。=

///转

首先,原式ab+a+b = ab+a+b+1-1 = (a+1)*(b+1)-1

令a = (a1+1)*(a2+1)-1;

b = (b1+1)*(b2+1)-1;

代入原式中可得:n = (a1+1)*(b1+1)*(a2+1)*(b2+1)-1;

因为原式的朋友数都是由1,2推到出来的

所以递推到最底层,那么(a1+1)*(b1+1)*(a2+1)*(b2+1)肯定是2,3的倍数(即是1+1,2+1)

所以最后就是要解决n+1得到的数到底是不是只有2,3这些因子

 

 

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!

 

 

 1 #include<stdio.h>
 2 
 3 int main()
 4 
 5 {
 6 
 7     __int64 n;
 8 
 9     while(~scanf("%I64d",&n))
10 
11     {
12 
13         if(!n) 
14 
15         {
16 
17         puts("NO!");
18 
19         continue;
20 
21         }
22 
23         n++;
24 
25         while(n%2==0||n%3==0)
26 
27         {
28 
29         if(n%2==0)  n/=2;
30 
31         else if(n%3==0)    n/=3;
32 
33         }
34 
35         if(n==1)
36 
37         puts("YES!");
38 
39         else puts("NO!");
40 
41     }
42 
43     return 0;
44 
45 }
View Code

 

posted @ 2015-02-02 09:33  江豚  阅读(129)  评论(0编辑  收藏  举报