链接:https://www.nowcoder.net/acm/contest/75/G
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。
输入描述:
本题有多组输入
每行一个数n,1<=n<=10^18.
输出描述:
每行输出输出不是2 5 11 13的倍数的数共有多少。
输入
15
输出
4
说明
1 3 7 9
题解:
主要是套公式,不能用for来循环一遍数据判断是否符合条件。
先分别求有多少是2、5、11、13的倍数,设分别有a、b、c、d个。
然后分别求有多少是10(2和5最小公倍数)、22(2和11最小公倍数)、26(2和13最小公倍数)、55(5和11最小公倍数)、65(5和13最小公倍数)、143(11和13)最小公倍数的倍数,设分别有ab,ac,ad,bc,bd,cd个。
再分别求有多少是110(2、5、11最小公倍数)、130(2、5、13最小公倍数)、715(5、11、13最小公倍数)、286(2、11、13最小公倍数)的倍数,设分别有abc,abd,acd,bcd个。
再求有多少是1430(2、5、11、13最小公倍数)的倍数,设有abcd个,
最后,不是2、5、11、13的倍数的数字有:
[n-(a+b+c+d)+(ab+ac+ad+bc+bd+cd)-(abc+abd+acd+bcd)+abcd]个
借鉴文章出处: 点击打开链接
#include<stdio.h>
int main()
{
long long int n,a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd;
while(~scanf("%lld",&n))
{
a=n/2;
b=n/5;
c=n/11;
d=n/13;
ab=n/10;
ac=n/22;
ad=n/26;
bc=n/55;
bd=n/65;
cd=n/143;
abc=n/110;
abd=n/130;
acd=n/715;
bcd=n/286;
abcd=n/1430;
printf("%lld\n",n-(a+b+c+d)+(ab+ac+ad+bc+bd+cd)-(abc+abd+acd+bcd)+abcd);
}
return 0;
}