容斥定理
给定a1,a2,.....,am,求1到n的整数中至少可以整除a中一个元素的数有多少个?3
#include<stdio.h> #define ll long long int a[1001]; int n,m; ll gcd(ll a, ll b) { if(a<=0||b<=0) return -1; else if(a>b) return gcd(a-b, b); else if(a<b) return gcd(a, b-a); else return a; } void solve() { ll res = 0; for(int i=1 ; i<(1<<m) ; i++) { int num=0; for(int j=i ; j!=0 ; j>>=1) num+=j&1; ll lcm = 1; for(int j=0 ; j<m ; j++) { if(i>>j&1) { lcm=lcm/gcd(lcm,a[j])*a[j]; if(lcm>n) break; } } if(num%2==0) res-=n/lcm; else res+=n/lcm; } printf("%d\n",res); } int main() { scanf("%d%d",&n,&m); for(int i=0 ; i<m ; i++) scanf("%d",&a[i]); solve(); return 0; }