HDU 1796 (容斥原理)

时间:2023-03-09 03:26:45
HDU 1796 (容斥原理)

容斥原理练习题,忘记处理gcd 和 lcm,wa了几发0.0.

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll Num[];
ll gcd(ll a,ll b)
{
return b == ? a : gcd(b,a%b);
}
int main()
{
ll N, M;
while(scanf("%lld%lld",&N,&M)!=EOF)
{
N--;
ll num = ;
ll tmp,Cnt = ;
for(int i = ; i < M; ++i)
{
scanf("%lld",&tmp);
if(tmp == ) continue;
else {
Num[Cnt++] = tmp;
}
}
for(int i = ; i < ( << Cnt) ; ++i)
{
ll cnt = , tmp = ;
for(int j = ; j < Cnt; ++j)
{
if(i & ( << j))
{
cnt++;
tmp =tmp /gcd(tmp,Num[j]) * Num[j];
}
//printf("%lld\n",tmp);
}
if(cnt & ) num += (N/tmp);
else num -= (N/tmp);
}
printf("%lld\n",num);
}
return ;
}