标签:
题意:
给你m个数的集合,给你一个n问你小于n并且是这m个数里面的数的倍数有多少
题解:
dfs容斥原理
奇数偶数加减法
#include<bits/stdc++.h> using namespace std; const int N = 3e6+20, M = 1e6+10, mod = 1e9+7,inf = 1e9+1; typedef long long ll; ll ans; int x,a[N],n,m; ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);} void dfs(int i,int num,ll tmp) { if(i>=m) { if(num==0) ans=0; else { if(num&1) ans = (ans+n/tmp); else ans = ans - n/tmp; } return ; } dfs(i+1,num,tmp); dfs(i+1,num+1,tmp*a[i]/gcd(tmp,a[i])); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int k = 0; n--; for(int i=1;i<=m;i++) { scanf("%d",&x); if(x) a[k++] = x; } m = k; ans = 0; dfs(0,0,1); printf("%I64d\n",ans); } return 0; }
HDU 1796 How many integers can you find 容斥入门
标签:
原文地址:http://www.cnblogs.com/zxhl/p/5475471.html