求解
做这道题前可以先看看 仪仗队 .
首先说一下为什么求解的是上方的式子,
对一个点 , 遮拦这个点的个数为 , 又因为一个点的贡献为 , 所以可以得到上式 .
重点为下方这个式子:
解法 :
容斥原理
考虑枚举, 统计有多少 满足 ,
以 为约数的点对数为 ,
只需将 不是最小公倍数的点对数减去就行了, 具体 容斥 过程见代码 .
时间复杂度
#include<cstdio>
#include<algorithm>
#define reg register
typedef long long ll;
const int maxn = 100005;
int N;
int M;
ll Ans;
ll cnt[maxn];
int main(){
scanf("%d%d", &N, &M);
for(reg int d = std::min(N, M); d >= 1; d --){
cnt[d] = (1ll*M/d) * 1ll*(N/d);
for(reg int j = 2; j*d <= std::min(N, M); j ++) cnt[d] -= cnt[j*d];
Ans += (d*2 - 1) * cnt[d];
}
printf("%lld
", Ans);
return 0;
}
解法 :
欧拉反演
存在这个等式
如果不懂请点击 这里
将 换为 , 原式变为
代码略 .