2013
12-21

# Friend

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.

There are several lines in input, each line has a nunnegative integer a, 0<=a<=2^30.

For the number a on each line of the input, if a is a friend number, output “YES!”, otherwise output “NO!”.

3
13121
12131

YES!
YES!
NO!

①1,2都是friend数

②如果a，b都是friend数，那么ab+a+b也是friend数

1,2生成的是 (1+1)(2+1)-1;

1,1生成的是 (1+1)^2 – 1;

2,2生成的是 (2+1)^2 – 1;

#include <iostream>
using namespace std;

int main()
{
int n, x, y;
while (~scanf ("%d", &n))
{
n++;
x = y = 0;
while (n % 2 == 0)
n /= 2, x++;
while (n % 3 == 0)
n /= 3, y++;
if (n == 1 && (x > 0 || y > 0))
puts ("YES!");
else puts ("NO!");
}
return 0;
}

1. Thanks for taking the time to examine this, I really feel strongly about it and love studying a lot more on this topic. If possible, as you acquire experience

2. 有两个重复的话结果是正确的，但解法不够严谨，后面重复的覆盖掉前面的，由于题目数据限制也比较严，所以能提交通过。已更新算法