过了一个寒假啥都不会了,做点一级题找点自信。昨天强行算了所有的情况给A了,虽然也是容斥但是写法总感觉不太优秀。今天翻题解找到一个介绍二进制优化的,顿时惊为天人(这次是这么用的吗……
总而言之大概理解了一下自己写了一波代码,已A。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll a[]={2,3,5,7};
int main(){
scanf("%lld",&n);
int i=1;
ll sum=0;
while(i<(1<<4)){
int num=0,mul=1;//num是取到的数的个数
for(int j=0;j<4;j++){
if(i&(1<<j)) num++,mul*=a[j];
}
if(num&1) sum+=n/mul;//奇数个数时是+
else sum-=n/mul;
i++;
}
printf("%lld\n",n-sum);
return 0;
}