思路1:暴力枚举(蓝桥数据太水了,能过)
C++代码:
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
long long ans=0,N,a,b,c;
cin>>N>>a>>b>>c;
for(long long i=1;i<=N;i++){
if(i%a!=0&&i%b!=0&&i%c!=0)
ans++;
}
cout<<ans;
return 0;
}
思路2:利用容斥定理求解
关于容斥定理的具体内容,可以参考这篇blog
C++代码:
#include <iostream>
#include <numeric>//引用lcm函数(最小公倍数)
using namespace std;
int main()
{
long long n;
long long a,b,c;
cin>>n>>a>>b>>c;
int xa=n/a;//求有多少a的倍数
int xb=n/b;//求有多少b的倍数
int xc=n/c;//求有多少c的倍数
int xab=n/lcm(a,b);//求有多少a,b最小公倍数的倍数
int xbc=n/lcm(b,c);//求有多少b,c最小公倍数的倍数
int xac=n/lcm(a,c);//求有多少a,c最小公倍数的倍数
int xabc=n/lcm(a,lcm(b,c));//求三个数的最小公倍数的个数
cout<<n-(xa+xb+xc-xab-xbc-xac+xabc);//容斥定理
}