|
沙发
楼主 |
发表于 2020-2-2 08:16:00
|
只看该作者
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- using namespace std;
- #define LL long long
- int n, m[130], a, b;
- LL ans;
- LL gcd (LL a, LL b){//最大公因数
- if (! b)
- return a;
- return gcd (b, a % b);
- }
- LL lcm (LL a, LL b){//最小公倍数
- return a * b / gcd (a, b);
- }
- void dfs (int k, int Index, LL v){//k代表第几次并集,Index代表到了第几个集合,v代表这个集合,如v=8,就代表8的倍数这个集合
- if (v > b)//超出范围就没有意义
- return ;
- if (k % 2 == 0)//第偶数次加,第基数次减
- ans += b / v - a / v;
- else
- ans -= b / v - a / v;
- for (int i = Index + 1; i <= n; i ++){
- LL t = lcm (v, m[i]);//求着两个集合的并集
- dfs (k + 1, i, t);//递归求解
- }
- }
- int main (){
- scanf ("%d", &n);
- for (int i = 1; i <= n; i ++)
- scanf ("%d", &m[i]);
- scanf ("%d %d", &a, &b);
- dfs (0, 0, 8);//从第0次开始
- printf ("%lld\n", ans);
- return 0;
- }
复制代码 |
|