51nod 1284 2 3 5 7的倍数
程序员文章站
2022-05-21 23:29:43
...
基准时间限制: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
容斥原理
第一次接触
举个例子
A∪B∪C∪D=|A|+|B|+|C|+|D| - |A∩B| - |B∩C| - |C∩A|- |A∩D| - |B∩D| - |C∩D|+|A∩B∩C|+|A∩B∩D| +|A∩C∩D|+|B∩C∩D| -|A∩B∩C∩D|
推导过程我们可以先看三个,比如你过程中出现的|B∪C∪D|
|B∪C∪D|=|B|+|C∪D|-|B∩(C∪D)|=|B|+|C|+|D|-|C∩D|-|[(B∩C)∪(B∩D)]|
=|B|+|C|+|D|-|C∩D|-|B∩C|-|B∩D|+|B∩C∩D|
//
关于此题 代码上已经推出了非常多的规律了
分开写会爆longlong
合在一起写就行
知道规律是非常快的
235的集合数就是5集合数/2*3
#include <iostream>
using namespace std;
int main()
{
//long long v2,v3,v5,v7;
//long is23,is25,is27,is35,is37,is57,is235,is237,is257,is357,is2357;
long long n;
cin>>n;
/*v2 = n / 2;
v3 = n / 3;
v5 = n / 5;
v7 = n / 7;
is23 = v3 / 2;
is25 = v5 / 2;
is27 = v7 / 2;
is35 = v5 / 3;
is37 = v7 / 3;
is57 = v7 / 5;
is235 = v5 / 6;
is237 = v7 / 6;
is257 = v7 / 10;
is357 = v7 / 15;
is2357 = v7 / 30;
//cout<<v2<<' '<<v3<<' '<<v5<<' '<<is23<<' '<<is35<<' '<<is25<<' '<<is235<<' '<<endl;
long long ans = v2 + v3 + v5 + v7 - is23 - is25 -is27 - is35 - is37 - is57 + is235 + is237 + is257 + is357 - is2357;
ans = n - ans;
cout<<ans<<endl;*/
long long ans;
ans = n - (n / 2 + n / 3 + n / 5 + n / 7 - n / 6 - n / 10 - n / 14 - n / 15 - n / 21 - n / 35 + n / 30 + n / 42 + n / 70 + n / 105 - n / 210);
cout<<ans<<endl;
return 0;
}
推荐阅读
-
js正则表达式之$1$2$3$4$5$6$7$8$9属性,返回子匹配的结果
-
编写计算并输出一个3*3阶矩阵对角线元素的和。 程序运行结果示例: 请输入数组元素:(3*3)↙ 1 2 3 4 5 6 7 8 9↙ ↙ 数组为:cqupt
-
给出数组array(1,9,5,8,3,7,2,4,6),写一个方法对其进行排序,使排序后的结果为(1,2,3,4,5,6,7,8,9)
-
OJ : 容斥原理计算出 1< =n < 1e9 中是2,3,5倍数的整数的数量
-
[算法题(二)]已知一个数组(升序且不重复,如 1, 2, 3, 5, 7, 8, 9),要求输出:1 ~ 3、5,7 ~ 9。 即:连续的区间之间不输出中间的数字。
-
js正则表达式之$1$2$3$4$5$6$7$8$9属性,返回子匹配的结果
-
51nod 1284 2 3 5 7的倍数
-
51nod 1284 2 3 5 7的倍数(容斥原理)
-
51Nod 1284 2 3 5 7的倍数(容斥)
-
51Nod 1284 2 3 5 7的倍数