HDU-1719 Friend

刚开始想打个表...

结果我发现我理解错了题目意思,以为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;
}

猜你喜欢

转载自www.cnblogs.com/cminus/p/11999877.html