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;
}
高中就想学数论,但是真的是自己没有时间,也没有想过走竞赛这条路,因为资源什么的都没有。我以为再也没机会学了,但现在看来,有些该学的,这辈子注定逃不过。
上一篇: 换域名的头痛事解决方案
下一篇: SQL语句实现格式化功能php代码
推荐阅读
-
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的倍数