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

来源:互联网 发布:hr淘宝秒杀 编辑:程序博客网 时间:2024/06/17 20:03

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+N723AB=A+BAB$
也就是说如果要求2的倍数和3的倍数的个数话,可以先将2的倍数个数+3的倍数个数-既是2的倍数和3的倍数,推广之后呢,也就是将奇数的加起来,减去偶数的,就是结果。为了更好的理解这个,直接上代码来看就好。

#include<iostream>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;}