1284 2 3 5 7的倍数

简介: 1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。 Input 输入1个数N(1
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
给出一个数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
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1284
分析:

此题是典型的容斥原理题,一开始理解错误,写成了丑数题,反正一直超时,后来才发现;

要求不是2,3,5,7的倍数的个数,可以先求出2,3,5,7的个数,之后通过n减去2,3,5,7的倍数的个数可求得不是2,3,5,7的倍数的个数;

而要知道2,3,5,7的倍数的个数,只需要分别知道2的倍数个数,3的倍数个数,5的倍数个数,7的倍数的个数,之后通过容斥原理(先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理--简而言之,就是对于重叠次数只有奇数次的,我们加上,重叠次数为偶数次的,我们要减去)可得到。最后即可得到不是2 3 5 7的倍数的个数。

下面给出AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     __int64 n;
 6     while(scanf("%I64d",&n)!=EOF)
 7     {
 8         __int64 a=n/2;
 9         __int64 b=n/3;
10         __int64 c=n/5;
11         __int64 d=n/7;
12         __int64 ab=n/6;
13         __int64 ac=n/10;
14         __int64 ad=n/14;
15         __int64 bc=n/15;
16         __int64 bd=n/21;
17         __int64 cd=n/35;
18         __int64 abc=n/30;
19         __int64 abd=n/42;
20         __int64 acd=n/70;
21         __int64 bcd=n/105;
22         __int64 abcd=n/210;
23         __int64 ans=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd;
24         printf("%I64d\n",n-ans);
25     }
26     return 0;
27 }

 

目录
相关文章
|
12月前
|
算法
把数组里面数值排成最小的数
把数组里面数值排成最小的数
32 1
|
5月前
26.一个正整数如果恰好等于它的因子之和,这个数称为“完数”,如6=1+2+3,求1000以内所有的完数.
26.一个正整数如果恰好等于它的因子之和,这个数称为“完数”,如6=1+2+3,求1000以内所有的完数.
45 0
打印3的倍数的数
打印3的倍数的数
65 0
一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如6=1+2+3.编程找出1000以内的所有完数
一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如6=1+2+3.编程找出1000以内的所有完数
673 0
一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如6=1+2+3.编程找出1000以内的所有完数
076.计算高次方数的尾数
076.计算高次方数的尾数
116 0
|
算法
【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5
【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5
285 0
【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5
|
存储
如何快速算出一个数的n次方?
先计算存储下来再求值,不失为一种好方法;但亦可以在计算 的同时判断 分解为 的幂(即转为 进制)后是否含 ,边计算边乘。 形式化地,对于 位,其代表的幂 为 ()。 这样,我们由低位向高位计算,每次将底数平方即可。 下面两份伪代码,分别对应这种方法的如上两种实现。
862 0
如何快速算出一个数的n次方?
输出2000-3000之间所有十位数是m且是n的倍数的数的个数
输出2000-3000之间所有十位数是m且是n的倍数的数的个数
115 0