题目链接:hdu1796
题目大意:给出m个数,在1~n(不包括n)之间找出所有能对m个数整除的
思路:枚举出所有可能组合,求出每一种组合的最小公倍数,运用容斥原理累加所有情况
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define LL __int64 int a[15],n,m; LL ans; int gcd(int a, int b) { if(a < b) swap(a,b); while(b) { int u = a%b; a = b; b = u; } return a; } void dfs(int pos, bool flag, LL LCM)//flag判断加还是减,LCM表示最小公倍数 { LCM = a[pos]*LCM/gcd(a[pos],LCM); if(flag) ans += n/LCM; else ans -= n/LCM; for(int i = pos + 1; i < m; i ++) dfs(i,!flag,LCM); } int main() { int i; while(~scanf("%d%d",&n,&m)) { for(i = 0; i < m; i ++) scanf("%d",&a[i]); sort(a, a+m); n--; ans = 0; for(i = 0; i < m; i ++) { if(a[i] == 0) continue;//0需要注意 dfs(i,1,a[i]); } printf("%I64d\n",ans); } return 0; }
原文:http://blog.csdn.net/jzmzy/article/details/21389531