题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1266
题 意:求出1~n个数中不能被输入的m个数任意一个数整除的数的个数。
思 路:利用容斥原理计算n-(1^n中质数能被m个数中的一个整除的数的个数。
例如样例一:10-能被2整除的数-能被3整除的数+能被6(即2与3的最小公倍数)整除的数;
样例二:20-能被2整除的数-能被4整除的数+能被4(即2与4的最小公倍数)整除的数。
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <climits>
#include <algorithm>
#define maxn 65535
typedef long long LL;
LL vis[33];
LL gcd( LL a, LL b )
{
return b?gcd(b,a%b):a;
}
int main()
{
int n, m;
while( scanf ( "%d %d", &n, &m ) != EOF )
{
for( int i = 0; i < m; i ++ )
scanf ( "%lld", &vis[i] );
int sum = 0;
for( int i = 1; i < ( 1 << m ); i ++ )
{
LL mu = 1, ones = 0;
for( int j = 0; j < m; j ++ )
if( i & (1<<j) )
{
mu = vis[j]/gcd(mu,vis[j])*mu;
if( mu > n ) break;
ones++;
}
if( mu > n ) continue;
if( ones%2==1) sum += n/mu;
else sum -= n/mu;
}
printf("%d\n",n-sum);
}
return 0;
}