题目描述
设
f(i)
为
i
的不同的质因子个数,求
n≤1012
题解
考虑 2f(i) 的意义:有 f(i) 总因子,每种可以分给两个人中的一个。那么就有 2f(i)=∑d|i[gcd(d,id)=1]
然后就是简单莫比乌斯反演了。
s=∑i=1n∑d|i[gcd(d,id)=1]=∑i=1n∑d|i∑j|d&&j|idμ(j)=∑i=1n∑j2|ig(ij2)μ(j)=∑j=1n√μ(j)∑i=1⌊nj2⌋g(i)=∑j=1n√μ(j)∑i=1⌊nj2⌋⌊nj2i⌋
时间复杂度: O(n√logn)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll p=998244353;
ll gao(ll x)
{
ll s=0;
ll i,j;
for(i=1;i<=x;i=j+1)
{
j=x/(x/i);
s+=(x/i)*(j-i+1);
}
return s;
}
int b[1000010];
int pri[1000010];
int cnt;
int miu[1000010];
int main()
{
ll i,j;
miu[1]=1;
for(i=2;i<=1000000;i++)
{
if(!b[i])
{
pri[++cnt]=i;
miu[i]=-1;
}
for(j=1;j<=cnt&&i*pri[j]<=1000000;j++)
{
b[i*pri[j]]=1;
if(i%pri[j]==0)
{
miu[i*pri[j]]=0;
break;
}
miu[i*pri[j]]=-miu[i];
}
}
ll ans=0;
ll n;
scanf("%lld",&n);
for(i=1;i*i<=n;i++)
ans=(ans+miu[i]*gao(n/(i*i)))%p;
ans=(ans+p)%p;
printf("%lld\n",ans);
return 0;
}