当前位置: 代码迷 >> 综合 >> UVA10325 The Lottery(容斥)
  详细解决方案

UVA10325 The Lottery(容斥)

热度:33   发布时间:2024-02-11 23:22:49.0

题意:

给定n,m,和一个长度为m的数组a
问[1,n]中有多少个数,不被a中的任何数整除

数据范围:n<=2^31,m<=15,a(i)<=n

解法:

反过来想,用总个数减去被整除的个数
答案=n-至少被一个数整除+至少被两个数整除-至少被三个数整除

因为m只有15,所以二进制枚举就行了(2^15=32768)
二进制枚举整除的k个数

根据前面我们推出的式子,根据二进制1的位数,奇减偶加就行了

ps:
代码中lcm不知道会不会爆longlong,不会算
理论上int范围内的15个大质数,计算lcm,好像是会爆的。
但是这题除了lcm我不知道咋做。

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=15;
int a[maxm];
int n,m;
int cal(int x){int ans=0;while(x){ans++;x&=(x-1);}return ans;
}
int lcm(int a,int b){return a/__gcd(a,b)*b;
}
signed main(){ios::sync_with_stdio(0);while(cin>>n>>m){for(int i=0;i<m;i++){cin>>a[i];}int ans=n;for(int i=1;i<(1<<m);i++){int lc=1;for(int j=0;j<m;j++){if(i>>j&1){lc=lcm(lc,a[j]);}}if(cal(i)&1){ans-=n/lc;}else{ans+=n/lc;}}cout<<ans<<endl;}return 0;
}