UVA10325 The Lottery [容斥原理]
容斥入门题一道, 蒟蒻的第一道自己yy出的容斥 其实就是你统计出 n n 以内能被整除的个数,再用总个数减去可行的个数,就是不可行的个数啦,但是对于 2 31 2 31 ,显然不能枚举,那么就容斥吧。 我们先对于一个数 x x , n n 以内能被他整除的个数就是 n / x n / x 向下取整这么多个,所以就可以 O ( 1 ) O ( 1 ) 的统计出这个个数。但对于多个数字,如果你加上对于 x x 和 y y 分别的能被整除的个数的话,那么既能被 x x 整除的又能被 y y 整除的就多算了一次,(可以自己在本子上画维恩图理解),那么就要减去多算的个数,然后依次类推啦。 上代码: #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll n,m,a,b; ll ans,num[20]; ll gcd(ll a,ll b){ if(!b) return a; else return gcd(b,a%b); } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } void dfs(int pos,ll a,int pd){ ll now=-1ll; if(!pd) now=1ll; if(pos)ans+=