• 容斥原理--题


    2016.1.27

    试题描述

    给定a1,a2,…,am,求1到n的整数中至少能整除a中一个元素的数有几个?

    输入
    输入n,m,和含有m个元素的集合,三者用空格分开
    输出
    输出可以整除a中一个元素的个数。
    输入示例
    100 2 {2,3}
    输出示例
    67
    其他说明
    限制条件:1≤n≤10的9次方。 1≤m≤15

    题干上四个大字容斥原理,你还有什么道理不用!

    状压暴搜都可以的啦~

    AC代码:

    #include<iostream>
    using namespace std;
    int n,m,a[20],ct,tot,ans;
    char ch; 
    inline int read()
    {
        int x,f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
        return x*f;
    }
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=m;i++) a[i]=read();
        for(int i = (1 << m) - 1 ; i >= 1 ; i-- )
        {
            ct=0;tot=1;
            for(int j = m - 1 ; j >= 0 ; j-- )
            {
                if(1<<j & i) ct++,tot*=a[j+1];
            }
            tot=n/tot;
            if(ct+1 & 1) tot=-tot;
            ans+=tot; 
        }
        cout<<ans;
    }
    View Code
  • 相关阅读:
    git命令
    Linux基础知识手册
    Linux系统编程
    A
    Subsequences in Substrings Kattis
    G
    K
    K
    C
    E
  • 原文地址:https://www.cnblogs.com/16er/p/5162587.html
Copyright © 2020-2023  润新知