欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

51Nod 1284 2 3 5 7的倍数

程序员文章站 2022-05-22 09:59:50
...

给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。
Input
输入1个数N(1 <= N <= 10^18)。
Output
输出不是2 3 5 7的倍数的数共有多少。
Input示例
10
Output示例
1

之前看不会,上次写了完全平方数那题之后,有了些感觉,不过对于容斥原理还是不太熟,就知道高一数学必修一第一章集合后面提到了一点点,当时没怎么记。只好百度,不过对于一般形式不大容易看懂,我直接记四个集合的容斥原理。如下:用|A|表示集合A的基数,也即集合A中元素的个数。则有
|A∪B∪C∪D|=|A|+|B|+|C|+|D|-|A∩B|-|A∩C|-|A∩D|-|B∩C|-|B∩D|-|C∩D|+|A∩B∩C|
+|A∩B∩D|+|A∩C∩D|+|B∩C∩D|-|A∩B∩C∩D|。那这个题就是先把至少是2或者是3或者是5或者是7的倍数的个数找出来,然后用总个数减去就好了。容斥原理就是用来处理第一步的。详细代码附上;

#include<stdio.h>
#include<math.h>

int main()
{
    long long int n;
    scanf("%I64d",&n);
    long long int a, b, c, d, ab, ac, ad, bc, bd, cd, abc, abd, bcd, acd, abcd;
     a=n/2;
     b=n/3;
     c=n/5;
     d=n/7;
     ab=n/6;
     ac=n/10;
     ad=n/14;
     bc=n/15;
     bd=n/21;
     cd=n/35;
     abc=n/30;
     abd=n/42;
     bcd=n/105;
     acd=n/70;
     abcd=n/210;
     long long int num=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+bcd+acd-abcd;
    printf("%I64d\n",n-num);
    return 0;
 } 

高中就想学数论,但是真的是自己没有时间,也没有想过走竞赛这条路,因为资源什么的都没有。我以为再也没机会学了,但现在看来,有些该学的,这辈子注定逃不过。