51 Nod 1284 2 3 5 7的倍数(容斥原理)

来源:互联网 发布:linux 显示当前目录 编辑:程序博客网 时间:2024/06/10 19:31

1284 2 3 5 7的倍数
基准时间限制: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;elseams -= n/k;}return ams; } int main(){scanf("%lld",&n);printf("%lld\n",n-nop());//拿总数减去和2 3 5 7不互质的数 return 0;}




原创粉丝点击