f(i)
f
(
i
)
表示将
i
i
分解质因数后的最高次幂。
求
老年人数论题,好像没什么好说的
一轮推导,有
ans=∑i=1a⌊ai⌋⌊bi⌋∑d|if(d)μ(id)
a
n
s
=
∑
i
=
1
a
⌊
a
i
⌋
⌊
b
i
⌋
∑
d
|
i
f
(
d
)
μ
(
i
d
)
某个函数与 μ μ 的狄利克雷卷积通常都会很好算,考虑 μ μ 不取0就可以了。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long LL;
const LL mo=1e9+7;
const int N=10000010;
int T;
int p[N],pk[N],k[N],u[N],prime[N],num;
LL g[N];
bool b[N];
LL n,m;
int main()
{
for(int i=2;i<N;i++)
{
if(!b[i])
prime[++num]=i,p[i]=pk[i]=i,u[i]=k[i]=1;
for(int j=1;j<=num&&i*prime[j]<N;j++)
{
int pj=prime[j];
p[i*pj]=pj;
b[i*pj]=1;
if(i%pj==0)
{
pk[i*pj]=pk[i]*pj;
k[i*pj]=k[i]+1;
u[i*pj]=u[i];
break;
}
u[i*pj]=u[i]+1;
pk[i*pj]=pj;
k[i*pj]=1;
}
if(u[i]==1||(k[i]==k[i/pk[i]]&&g[i/pk[i]]))
g[i]=(u[i]&1) ? 1 : -1;
}
for(int i=1;i<N;i++)
g[i]=g[i]+g[i-1];
cin>>T;
while(T--)
{
LL ans=0;
scanf("%lld%lld",&n,&m);
if(n>m)
swap(n,m);
for(LL last,i=1;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ans+=(g[last]-g[i-1])*(n/i)*(m/i);
}
printf("%lld\n",ans);
}
return 0;
}