自己尝试推 但是没有推出来 太不机智了!后来提交的时候还忘记加‘!’ 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 }