导航

容斥原理--题

Posted on 2016-01-27 11:11  POOH1DROSE  阅读(310)  评论(0编辑  收藏  举报

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