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; }