Now you get a number N, and a M-integers set, you should find out how many integers which are small than N, that they can divided exactly by any integers in the set. For example, N=12, and M-integer set is {2,3}, so there is another set {2,3,4,6,8,9,10}, all the integers of the set can be divided exactly by 2 or 3. As a result, you just output the number 7.
题目大意:给你一个数n,和m个0~20的整数i,让你求1~n-1中是i的倍数的数有几个。
显然,这是一个容斥定理的题,求对1~(n-1)中所有m个i的倍数的数的个数。并且m<=10,因此我们用二进制枚举法就能够列出所有的情况。
需要注意的就是m个数,把这m个数先化成互质的。最后在套用模板即可。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; ll a[500]; int main() { ll n, m; while(~scanf("%lld%lld",&n,&m)) { int top = 0; for(int i = 0; i < m; ++ i) { ll x; cin >> x; if(x != 0) a[top++] = x; } ll ans = 0,sum,num; for(int i = 1; i < (1 << top); ++ i) { num=0,sum=1; for(int j = 0; j < top; ++ j) { if((i >> j) & 1) { num++; sum = sum * a[j] /(__gcd(sum, a[j])); } } if(num % 2) { ans += (n - 1) / sum; } else { ans -= (n - 1) / sum; } } cout << ans << endl; } return 0; }
以上。