abc=a+b+c-ab-ac-bc+abc
abcd=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+bcd-abcd
.
.
.
dfs枚举,传参保证当前是加还是减,注意输入检查以及<n
#include <stdio.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; typedef long long ll; ll t[20]; ll n,ans; int m; ll gcd(ll a,ll b) { return a%b==0?b:gcd(b,a%b); } void dfs(int p,ll num,int flag) { if(p) ans+=flag*n/num; for(int i=p+1;i<=m;i++) { dfs(i,t[i]/gcd(t[i],num)*num,-flag); } } int main() { while(cin>>n>>m) { for(int i=1;i<=m;i++) { cin>>t[i]; if(t[i]<=0||t[i]>=n) i--,m--; } n--; ans=0; dfs(0,1,-1); cout<<ans<<endl; } return 0; }