分析:
具体思路见代码。
主要是注意 个 以内的素数相乘会爆 。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[25]; int k; ll solve(ll n) { if(n==0||n==1) return 0; ll ans=0; for(int i=(1<<k)-1;i>=1;i--) { int cnt=0; ll res=1; for(int j=k-1;j>=0;j--) { if((i>>j)&1) { res*=a[j]; cnt++; } if(res>n)//注意 res=0; } if(res&&(cnt&1)) ans+=(n/res); else if(res&&(cnt%2==0)) ans-=(n/res); } return ans; } int main() { ll l,r; scanf("%lld%lld%d",&l,&r,&k); for(int i=0;i<k;i++) scanf("%lld",&a[i]); printf("%lld\n",r-l+1-solve(r)+solve(l-1)); return 0; }