刚开始想打个表...
结果我发现我理解错了题目意思,以为a,b必须是两个不同的数字,然后完全无法理解样例的3为什么是friend number...很尴尬就只能去网上找题解,才发现a,b可以相等(太菜了
其实打表也能做,但是实在是懒,这道题由于n = a * b + a + b -> n + 1 = (a + 1)(b + 1),我们假设这个数列是{n + 1},那里面任意一个元素都等于这个数列中原来两个数的乘积,又因为它们开始都是2, 3,所以质因数只有2, 3就是Friend number,然后就很好判断了,我这里偷懒用了a & (-a)是否等于a来判断是不是2的倍数
#include <cstdio> using namespace std; int main() { int a; while (~scanf("%d", &a)) { if (a == 0) { puts("NO!"); continue; } a = a + 1; while (a % 3 == 0) { a = a / 3; } if ((a & (-a)) == a) puts("YES!"); else puts("NO!"); } return 0; }