Java教程

1030 大水题 容斥原理

本文主要是介绍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;
    }
}

 

这篇关于1030 大水题 容斥原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!