1030 大水题 容斥原理

链接:https://ac.nowcoder.com/acm/contest/26656/1030
来源:牛客网

题目描述

给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。

输入描述:

本题有多组输入
每行一个数n,1<=n<=10^18.

输出描述:

每行输出输出不是2 5 11 13的倍数的数共有多少。
示例1

输入

复制
15

输出

复制
4

说明

1 3 7 9

 分析

容斥原理。算出总数,再算出不符合条件的方案数。总方案数 - 奇数个限制量相乘的方案数 + 偶数个限制量相乘的方案数

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
#define int ll

int a[6],n;

signed main() {
    
    a[0] = 2,a[1] = 5,a[2] = 11,a[3] = 13;
    
    while(cin>>n) {
        int st = 4,ans = 0;
        for(int i = 0;i < (1 << st) ;i ++ ) {
            int tmp = 1,cnt = 0;
            for(int j = 0;j<4;j++) {
                if( (i >> j) & 1 ) {
                    cnt ++ ;
                    tmp *= a[j];
                }
            }
            
            if(cnt & 1) ans -= n / tmp;
            else ans += n / tmp;
        }
        cout<<ans<<endl;
    }
}

 

posted @ 2022-07-29 00:56  er007  阅读(18)  评论(0编辑  收藏  举报