12 2 2 3
7
/* *********************************************** Author :CKboss Created Time :2015年03月27日 星期五 16时11分03秒 File Name :HDOJ1796.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; int n,m; vector<int> vi; int RET; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } int lcm(int a,int b) { return a/gcd(a,b)*b; } int N; void dfs(int x,int mark,int L) { for(int i=x;i<m;i++) { int nl=lcm(L,vi[i]); RET+=mark*N/nl; dfs(i+1,-mark,nl); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF) { vi.clear(); for(int i=0;i<m;i++) { int x; scanf("%d",&x); if(x) vi.push_back(x); } N=n-1; RET=0; dfs(0,1,1); printf("%d\n",RET); } return 0; }
HDOJ 1796 How many integers can you find 容斥原理
原文:http://blog.csdn.net/ck_boss/article/details/44680007