2017-07-07 2,3,5,7倍数

1~n中不是2,3,5,7倍数的个数

首先看到这个题目,因为没有看到输入的大小和时间要求,就用了直接就能想到的方法来做,也就是遍历1~n中的所有数,然后对每一个数都和2,3,5,7求余数,这种方法在n的大小比较小的情况下还是可以的,但是我一看输入的大小 1N1018 ,我瞬间就吓尿了,这是什么数量级啊,然后我就知道这个题目肯定不能用遍历来做了,然后我就没有办法啦,然后我百度了一下,又是新技能get。

首先比如要求N中2的倍数的个数,直接用 N2 就可以算出来了,比如10中2的倍数的的个数直接就可以算出来是5,可以说是非常神奇了,长这么大我还是第一见过这种操作。然后,求N中不是2,3,5,7倍数的个数,可以先算出是2,3,5,7倍数的个数,然后用N减掉就可以了,重点是,求2,3,5,7倍数的时候不能直接将 N2+N3+N5+N723 AB=A+BAB $
也就是说如果要求2的倍数和3的倍数的个数话,可以先将2的倍数个数+3的倍数个数-既是2的倍数和3的倍数,推广之后呢,也就是将奇数的加起来,减去偶数的,就是结果。为了更好的理解这个,直接上代码来看就好。

#include
using namespace std;

long long n, a, b, c, d, ab, ac, ad, bc, bd, cd, abc, abd, acd, bcd, abcd;
int main() {
    cin >> n;
    a = n / 2; //2的倍数的个数
    b = n / 3; //同理
    c = n / 5;
    d = n / 7;
    ab = n / 6; //同时为2和3倍数的个数,除的是2和3的最小公倍数
    ac = n / 10;//下面同理
    ad = n / 14;
    bc = n / 15;
    bd = n / 21;
    cd = n / 35;
    abc = n / 30;
    abd = n / 42;
    acd = n / 70;
    bcd = n / 105;
    abcd = n / 210;
    cout << n-(a + b + c + d - ab - ac - ad - bc - bd - cd + abc + abd + acd + bcd - abcd) << endl;
    return 0;
}

你可能感兴趣的:(个人学习记录)