description:
给出一个包含k个全素数序列A 对于一个数x A中没有x的因子 则称x与A无关 问区间L,R中包括多少个与A无关的数
solution:
L,R的范围很大 1e18 暴力肯定不可取 观察到k的范围很小 从k入手 考虑生成1~k的全排列 复杂度爆炸
考虑容斥原理 由于每个Ai都是素数 所以对于 x 是a[i]的倍数为 x/a[i]个 对于Ai 和 Aj 则为 x / (a[i] * a[j]) 个 ...
所以不为ai倍数个数为 x - x / a[i]
用递归求出倍数个数 利用前缀和思想 把答案转换为 dfs(r) - dfs(l - 1) 即可 复杂度
code:
#include <bits/stdc++.h> using namespace std; #define LL long long int a[25],k; LL dfs(int dep,LL x){ if(dep == k){ return x; } return dfs(dep + 1,x) - dfs(dep + 1,x / a[dep]); } int main(){ LL l,r; cin >> l >> r >> k; for(int i = 0;i < k;i ++){ cin >> a[i]; } cout << dfs(0,r) - dfs(0,l - 1) << '\n'; return 0; }