您的位置:首页 > 编程语言 > Go语言

UVA 10325 - The Lottery ( 容斥 )

2015-08-27 11:02 399 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm 容斥定理