基准时间限制: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
题意:》》》》》;
思路:容斥原理:我们找出和2 3 5 7不互质的数,拿总数减去即可;
下面附上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[6]={2,3,5,7};//储存质因子;
ll n;
ll nop()
{
ll ams=0;
for(ll i = 1;i < (1<<4);i++)//有4个质因子的话那么他们就会有2^4-1个组合
{
ll ans=0;
ll k=1;
for(ll j=0;j<4;j++)
{
if(i & (1<<j))//这是来验证哪几个质因子被选中
{ //比如当i=3,j=2时,i和j进行与运算
ans++; // 0011 & 0010 ----> 0010,那么表示
k*=num[j];//第二个质因子'3'被选中,这样就可以得到不同数的组合
}
}
if(ans & 1)//当选中的数的个数是奇数,就加上,(容斥原理---->奇加偶减)
ams += n/k;
else
ams -= n/k;
}
return ams;
}
int main()
{
scanf("%lld",&n);
printf("%lld\n",n-nop());//拿总数减去和2 3 5 7不互质的数
return 0;
}