求助 70PTS
查看原帖
求助 70PTS
413370
florence25楼主2023/8/2 09:48
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int n, l, r;
int a[30];

ll gcd(ll a, ll b) {
	if (b == 0) return a;
	return gcd(b, a % b);
}

ll sol(int x) {
	ll l = 0, r = 1e18;
	while (l < r) {
		ll mid = l + r >> 1, sum = 0;
		for (int i = 1; i <= n; ++ i) sum += mid / a[i];
		if (sum <= x) l = mid + 1;
		else r = mid;
	}
	ll ymax = l, ans = 0;
	for (int i = 1; i < (1 << n); ++ i) {
		ll lcm = 1, cnt = -1;
		for (int j = 0; j < n; ++ j) {
			if (lcm > ymax) break ;
			if (i & (1 << j)) lcm = lcm * a[j + 1] / gcd(lcm, a[j + 1]), cnt *= -1;
		}
		if (lcm > ymax) continue ;
		ans += cnt * (ymax / lcm);
	} 
	return ans;
}

void read() {
	scanf("%d%d%d", &n, &l, &r);
	for (int i = 1; i <= n; ++ i)
		scanf("%d", &a[i]);
	ll ans = sol(r) - sol(l - 1);
	printf("%lld\n", ans);
}

int main() {
	read();
	return 0;
}
2023/8/2 09:48
加载中...