Mys_C_K的质数集合计数好题 - 数论

定义F(n)为n中不同的质因子个数,求: ni=12F(i),n1012 ∑ i = 1 n 2 F ( i ) , n ≤ 10 12

首先考虑一个 O(n23) O ( n 2 3 ) 的暴力,即 2F(i) 2 F ( i ) 是在枚举i的质因子集合的子集。那么改成枚举这个子集k,那么有恰好 nk ⌊ n k ⌋ 个数字包含这个集合,也就是:

Ans=k=1nμ2(k)nk A n s = ∑ k = 1 n μ 2 ( k ) ⌊ n k ⌋

然后莫比乌斯函数平方的前缀和怎么求呢?继续考虑其意义,然后容斥,则:
i=1nμ2(i)=i=1nni2μ(i) ∑ i = 1 n μ 2 ( i ) = ∑ i = 1 n ⌊ n i 2 ⌋ μ ( i )

然后预处理一波就可以做到 O(n23) O ( n 2 3 )

然后考虑用更数论的办法推:

2F(n)=d|nμ2(d)=d|nk2|dμ(k) 2 F ( n ) = ∑ d | n μ 2 ( d ) = ∑ d | n ∑ k 2 | d μ ( k )

i=1n2F(i)=i=1nd|ik2|dμ(k)=k=1nμ(k)k2|dnd ∑ i = 1 n 2 F ( i ) = ∑ i = 1 n ∑ d | i ∑ k 2 | d μ ( k ) = ∑ k = 1 n μ ( k ) ∑ k 2 | d ⌊ n d ⌋

=k=1nμ(k)i=1nk2nk2i=k=1nμ(k)S(nk2) = ∑ k = 1 n μ ( k ) ∑ i = 1 ⌊ n k 2 ⌋ ⌊ n k 2 i ⌋ = ∑ k = 1 n μ ( k ) S ( ⌊ n k 2 ⌋ )

S(n)=ni=1ni S ( n ) = ∑ i = 1 n ⌊ n i ⌋ 可以直接数论分 O(n) O ( n ) 块求。
复杂度为:
O(ni=1ni2)=O(nni=11i)=O(nlgn) O ( ∑ i = 1 n n i 2 ) = O ( n ∑ i = 1 n 1 i ) = O ( n l g n )

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<assert.h>
#define SN 1000010
#define lint long long
#define mod 1000000007
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
int p[SN],mu[SN],notp[SN];
inline int prelude(int n)
{
    mu[1]=1;
    for(int i=2,c=0;i<=n;i++)
    {
        if(!notp[i]) p[++c]=i,mu[i]=-1;
        for(int j=1;j<=c&&p[j]<=n/i;j++)
        {
            int x=p[j]*i;notp[x]=1;
            if(i%p[j]) mu[x]=-mu[i];
            else { mu[x]=0;break; }
        }
    }
    return 0;
}
inline lint F(lint n,lint ans=0)
{
    for(lint s=1,t;s<=n;s=t+1) t=n/(n/s),ans+=(n/s)*(t-s+1);
    return ans%mod;
}
int main()
{
    lint n,ans=0,sn=1;scanf("%lld",&n);
    while((sn+1ll)*(sn+1)<=n) sn++;prelude(sn);
    for(int i=1;i<=n/i;i++) if(mu[i]) ans+=mu[i]*F(n/i/i);
    return !printf("%lld\n",ans=(ans%mod+mod)%mod);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值