51Nod 1284 2 3 5 7的倍数

给出一个数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;
 } 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值