The Lottery UVA - 10325(容斥,二进制枚举)

题意:给m个数字,求1到n中不能被m个数字中任意一个数字整除的数的个数。

int a[20];
int main()
{
	//freopen("in.txt", "r", stdin);
	ll n, m;
	while (cin >> n >> m)
	{
		f(i, 1, m)scanf("%d", &a[i]);
		ll ans = 0;
		f(i, 1, (1 << m) - 1)
		{
			int cot = 0;
			ll LCM = 1;
			f(j, 0, m - 1)
			{
				if (i >> j & 1)
				{
					cot++;
					LCM = LCM * a[j+1] / gcd(LCM, a[j+1]);
				}
			}
			if (cot & 1)ans += n/LCM;
			else ans -= n / LCM;
		}
		printf("%lld\n", n-ans);
	}
	return 0;
}

你可能感兴趣的:(基础数论)