求助,帮帮蒟蒻把
查看原帖
求助,帮帮蒟蒻把
895690
gghack_Nythix楼主2024/8/7 14:53

rt,为什么整除分块上界要这么设?

#include<iosfwd>
#include<iostream>
#define int long long
using namespace std;
int a,b,c,d,k;
const int MAXX = 500005;
int mu[MAXX + 5],smu[MAXX + 5],pri[MAXX + 5],cnt;
bool vis[MAXX + 5];
inline void _() {
	mu[1] = 1;
	for(int i = 2;i <= MAXX;++i) {
		if(!vis[i]) pri[++cnt] = i,mu[i] = -1;
		for(int j = 1;j <= cnt && pri[j] * i <= MAXX;++j) {
			vis[pri[j] * i] = 1;
			if(i % pri[j] == 0){mu[i * pri[j]] = 0;break;}
			mu[i * pri[j]] -= mu[i];
		}
	}
	for(int i = 1;i <= MAXX;++i) smu[i] = smu[i - 1] + mu[i];
}
inline void solve() {
	long long ans = 0;
	int L = 1,R = 0;
	if(b > d) swap(b,d),swap(a,c);
	for(L = 1;L <= b;L = R + 1) {
		R = min( min(a / L?a / (a / L):1145141919,c / L?c / (c / L):1145141919) , min(b / (b / L) , d / (d / L)) );
		long long val = ((b / L) - (a / L)) * ((d / L) - (c / L));
		ans = (ans + val * (smu[R] - smu[L - 1]));
	}
	return cout << ans << '\n',void();
}
inline void th_E() {
	cin >> a >> b >> c >> d >> k;
	a = (a - 1) / k,b /= k,c = (c - 1) / k,d /= k;
	solve();
}

int32_t main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin >> T;
	_();
	while(T-->0) th_E();
	
}
2024/8/7 14:53
加载中...