【JZOJ 5250】 质数

24 篇文章 0 订阅

Description

i=1n2f(i)mod 998244353

其中 f(i) 表示 i 的不同质因子个数
n1012

Analysis

g(i)=2f(i) ,容易发现 g(i) 是积性函数,可以用线性筛法筛出来,不过没什么用
答案的表示有很多种,仔细想想

Ans=i=1nd|iμ2(d)=i=1nn/iμ2(i)

这一条是栋爷考场上写的,听说复杂度玄妙 O(n2/3) ,然而我忘记怎么推的了QAQ
听说Crazy用杜教筛强上,给 g 卷上μ可以得到 μ2 ,不是特别清楚
我自己乱推好像也推出了答案的式子
Ans=i=1nj=1,ijnn[(i,j)=1]

一筹莫展,于是我根据套路无中生有个 μ
=i=1nj=1n/id|(i,j)μ(d)

内层外移,好像直接出来了。。。
=d=1nμ(d)i=1n/d2n/(d2i)

没了?没了
复杂度粗略分析是 O(n ln n) ,不是很懂,但是因为 d2 增长迅速所以实践跑得挺快

Code

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(ll i=a;i<=b;i++)
#define fd(i,b,a) for(ll i=b;i>=a;i--)
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
using namespace std;
typedef long long ll;
const ll N=1e6+5,mo=998244353;
ll pr[N],mu[N];
bool bz[N];
void pre(ll n)
{
    mu[1]=1;
    fo(i,2,n)
    {
        if(!bz[i]) pr[++pr[0]]=i,mu[i]=-1;
        fo(j,1,pr[0])
        {
            ll x=i*pr[j];
            if(x>n) break;
            bz[x]=1;
            if(i%pr[j]==0){mu[x]=0;break;}
            mu[x]=-mu[i];
        }
    }
    fo(i,1,n) mu[i]+=mu[i-1];
}
ll calc(ll n)
{
    ll s=0;
    for(ll i=1,j;i<=n;i=j+1)
    {
        j=n/(n/i);
        s=(s+(j-i+1)%mo*(n/i)%mo)%mo;
    }
    return s;
}
int main()
{
    ll n,ans=0;
    scanf("%lld",&n);
    ll m=sqrt(n);
    pre(m);
    for(ll i=1,j;i<=m;i=j+1)
    {
        ll t=n/(i*i);
        j=min(m,sqrt(n/t));
        (ans+=(mu[j]-mu[i-1]+mo)%mo*calc(t)%mo)%=mo;
    }
    printf("%lld",ans);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值