hdu1695 GCD

莫比乌斯反演练习题。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
int T, b, d, a, c, k, mu[100005], pri[100005], cnt;
bool isp[100005];
ll ans;
void shai(){
	memset(isp, true, sizeof(isp));
	isp[0] = isp[1] = false;
	mu[1] = 1;
	for(int i=2; i<=100000; i++){
		if(isp[i])	 pri[++cnt] = i, mu[i] = -1;
		for(int j=1; j<=cnt; j++){
			if(i*pri[j]>100000)	break;
			isp[i*pri[j]] = false;
			if(i%pri[j]==0){
				mu[i*pri[j]] = 0;
				break;
			}
			mu[i*pri[j]] = -mu[i];
		}
	}
}
ll getAns(int l, int r){
	ll tmp=0;
	for(int i=1; i<=l; i++)
		tmp += mu[i] * (ll)(l/i) * (ll)(r/i);
	return tmp;
}
int main(){
	cin>>T;
	shai();
	for(int i=1; i<=T; i++){
		ans = 0;
		scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
		if(k){
			b /= k; d /= k;
			ans = getAns(min(b,d), max(b,d)) - getAns(min(b,d), min(b,d))/2;
		}
		printf("Case %d: %lld\n", i, ans);
	}
	return 0;
}
posted @ 2018-01-25 15:06  poorpool  阅读(160)  评论(0编辑  收藏  举报