题面
https://www.lydsy.com/JudgeOnline/problem.php?id=3309
求
T<=10000,1<=a,b<=107
其中 f(n) 是 n 所含质因子的最大幂指数。
思路
这个反演很简单,假设
设后面的那堆为 F(T) ,求 F(T) 的前缀和,这是个含 μ 的狄利克雷卷积,根据 μ 的特性,我们也能筛出每个 F 。
明显不是积性,将
如果存在
qi<ki−1
,
d
没有贡献。考虑有贡献的,若存在两个不同的
假如全部一样呢?
μ
那边取的不在
f
里的集合元素奇偶个数也是一样啊!但有一种情况就是
这样就可以愉快地线筛了,记录最小质因子的个数
e[i]
,最小质因子组成的约数
g[i]
,算
F
就是判断一下,然后转移,跟求
代码
#include <bits/stdc++.h>
#define maxn 10000100
using namespace std;
typedef long long LL;
int T, n, m, cnt;
int prime[maxn], g[maxn], e[maxn], F[maxn];
bool Vis[maxn];
LL ans;
void Pre(){
for(int i = 2; i < maxn; i++){
if(!Vis[i]){
prime[++cnt] = i;
e[i] = F[i] = 1;
g[i] = i;
}
for(int j = 1; j <= cnt; j++){
if(i * prime[j] >= maxn) break;
Vis[i * prime[j]] = true;
if(i % prime[j] == 0){
e[i * prime[j]] = e[i] + 1;
g[i * prime[j]] = g[i] * prime[j];
int tmp = i / g[i];
if(tmp == 1) F[i * prime[j]] = 1;
else F[i * prime[j]] = (e[tmp] == e[i * prime[j]]) ? -F[tmp] : 0;
break;
}
else{
e[i * prime[j]] = 1;
g[i * prime[j]] = prime[j];
F[i * prime[j]] = (e[i] == 1) ? -F[i] : 0;
}
}
}
for(int i = 2; i < maxn; i++) F[i] += F[i-1];
}
int main(){
freopen("4-9.in", "r", stdin);
freopen("4-9.out", "w", stdout);
Pre();
scanf("%d", &T);
while(T --){
scanf("%d%d", &n, &m);
if(n > m) swap(n, m);
int last;
ans = 0;
for(int i = 1; i <= n; i = last+1){
last = min(n/(n/i), m/(m/i));
ans += 1LL * (n / i) * (m / i) * (F[last] - F[i-1]);
}
printf("%lld\n", ans);
}
return 0;
}
向前走,别回头。