题解 P4466 [国家集训队]和与积

题目描述

给出 N N N,统计满足下面条件的数对 ( a , b ) (a,b) (a,b)的个数:

  1. 1 ≤ a &lt; b ≤ N 1\le a&lt;b\le N 1a<bN
  2. a + b a+b a+b整除 a × b a×b a×b

输入输出格式

输入格式

一行一个数 N N N

输出格式

一行一个数表示答案

思路讲解

比较好的莫比乌斯反演题了。

ans = ∑ a = 1 N ∑ b = a + 1 N [ ( a + b ) ∣ a b ] \text{ans}=\sum_{a=1}^N\sum_{b=a+1}^{N}[(a+b)|ab] ans=a=1Nb=a+1N[(a+b)ab]
考虑到令: d = ( a , b ) ,   a = i ⋅ d ,   b = j ⋅ d d=(a,b),\ a=i\cdot d,\ b=j\cdot d d=(a,b), a=id, b=jd
( i d + j d ) ∣ i j d 2 ⇔ d ( i + j ) ∣ i j d 2 ⇔ ( i + j ) ∣ i j d (id+jd)|ijd^2⇔d(i+j)|ijd^2⇔(i+j)|ijd (id+jd)ijd2d(i+j)ijd2(i+j)ijd
又有 ( i + j , i j ) = 1 (i+j,ij)=1 (i+j,ij)=1,所以只能有:
( i + j ) ∣ d (i+j)|d (i+j)d
给出合法的 ( i , j ) (i,j) (i,j),求出满足条件的 d d d的个数。

= ∑ i = 1 N ∑ j = i + 1 N [ ( i , j ) = 1 ] ⌊ n j ( i + j ) ⌋ =\sum_{i=1}^{\sqrt{N}}\sum_{j=i+1}^{\sqrt{N}}[(i,j)=1]\left\lfloor\frac{n}{j(i+j)}\right\rfloor =i=1N j=i+1N [(i,j)=1]j(i+j)n
不难想到反演:
= ∑ i = 1 N ∑ j = 1 N ∑ δ ∣ ( i , j ) μ ( δ ) ⌊ n j ( i + j ) ⌋ =\sum_{i=1}^{\sqrt{N}}\sum_{j=1}^{\sqrt{N}}\sum_{\delta|(i,j)}μ(\delta)\left\lfloor\frac{n}{j(i+j)}\right\rfloor =i=1N j=1N δ(i,j)μ(δ)j(i+j)n
μ ( δ ) μ(\delta) μ(δ)的和式提前:
= ∑ δ = 1 N μ ( δ ) ∑ i = 1 ⌊ N δ ⌋ ∑ j = i + 1 ⌊ N δ ⌋ ⌊ N δ 2 j ( i + j ) ⌋ =\sum_{δ=1}^{\sqrt{N}}μ(\delta)\sum_{i=1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\sum_{j=i+1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\left\lfloor\frac{N}{\delta^2j(i+j)}\right\rfloor =δ=1N μ(δ)i=1δN j=i+1δN δ2j(i+j)N
= ∑ δ = 1 N μ ( δ ) ∑ i = 1 ⌊ N δ ⌋ ∑ j = i + 1 ⌊ N δ ⌋ ⌊ ⌊ N j δ 2 ⌋ i + j ⌋ =\sum_{δ=1}^{\sqrt{N}}μ(\delta)\sum_{i=1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\sum_{j=i+1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\left\lfloor\frac{\left\lfloor\frac{N}{j\delta^2}\right\rfloor}{i+j}\right\rfloor =δ=1N μ(δ)i=1δN j=i+1δN i+jjδ2N
这个算法是正确的,但仍需要优化。

可以令 α = i + j \alpha=i+j α=i+j:
= ∑ δ = 1 N μ ( δ ) ∑ j = 1 ⌊ N δ ⌋ ∑ α = j + 1 2 j − 1 ⌊ ⌊ N j δ 2 ⌋ α ⌋ =\sum_{δ=1}^{\sqrt{N}}μ(\delta)\sum_{j=1}^{\left\lfloor\frac{\sqrt{N}}{\delta}\right\rfloor}\sum_{\alpha=j+1}^{2j-1}\left\lfloor\frac{\left\lfloor\frac{N}{j\delta^2}\right\rfloor}{\alpha}\right\rfloor =δ=1N μ(δ)j=1δN α=j+12j1αjδ2N
先预处理莫比乌斯函数,后面就是个分块了。

#include <cstdio>
#include <iostream>
#include <cmath>

using namespace std;
const int N = 1e+5 + 1;
typedef long long ll;
int n, m, tot, Mu[N], P[N];
bool flag[N];
ll ans;

void sieve() {
	Mu[1] = 1;
	for(int i = 2; i <= m; i++) {
		if(!flag[i]) P[++tot] = i, Mu[i] = -1;
		for(int j = 1; j <= tot; j++) {
			if(i * P[j] > m) break;
			flag[i * P[j]] = 1;
			Mu[i * P[j]] = -Mu[i];
			if(i % P[j] == 0) {Mu[i * P[j]] = 0; break;}
		}
	}
}
ll L(int x, int y) {
	ll res = 0; int z = x << 1;
	if(!y) return 0;
	for(int l = x + 1, r; l < z; l = r + 1) {
		if(!(y / l)) return res;
		r = min(y / (y / l), z - 1);
		res += (r - l + 1) * (y / l);
	}
	return res;
}
int main()
{
	scanf("%d", &n);
	m = sqrt(n);
	sieve();
	for(int k = 1; k <= m; k++) {
		if(!Mu[k]) continue;
		for(int x = 1; x * k <= m; x++)
			ans += Mu[k] * L(x, n / (x * k * k));
	}
	printf("%lld", ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值