[POI 2007] ZAP-Queries(莫比乌斯反演) | 错题本

文章目录

题目

[POI2007]ZAP-Queries

分析

[HAOI 2011] Problem b

代码

很迷惑的是筛莫比乌斯函数的时候要把 MAXN 开大一点点不然只有 80 pts。

#include <bits/stdc++.h>

typedef long long LL;

const int MAXN = 60000;

int Mu[MAXN + 5];
bool Vis[MAXN + 5];
std::vector<int> Primes;

void Init(int n) {
	Mu[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (!Vis[i])
			Mu[i] = -1, Primes.push_back(i);
		for (int j = 0; j < (int)Primes.size() && i * Primes[j] < n; j++) {
			Vis[i * Primes[j]] = true;
			if (i % Primes[j] == 0) {
				Mu[i * Primes[j]] = 0;
				break;
			}
			Mu[i * Primes[j]] = -Mu[i];
		}
        Mu[i] += Mu[i - 1];
	}
}

LL Cal(int N, int M) {
    if (N < M) std::swap(N, M); LL Ans = 0;
    for (int lft = 1, rgt = 1; lft <= M; lft = rgt + 1) {
        rgt = std::min(M / (M / lft), N / (N / lft));
        Ans += (LL)(N / lft) * (M / lft) * (Mu[rgt] - Mu[lft - 1]);
    }
    return Ans;
}

int main() {
    Init(MAXN);
    int T; scanf("%d", &T);
    while (T--) {
        int A, B, K; scanf("%d%d%d", &A, &B, &K);
        printf("%lld\n", Cal(A / K, B / K));
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值