2020 Multi-University Training Contest 1---- HDU--6760、Math is Simple(数论、莫比乌斯反演)

题目链接

题面:
在这里插入图片描述

题意:
求:
f ( n ) = ∑ 1 ≤ a < b ≤ n , g c d ( a , b ) = 1 , a + b > = n 1 a b f(n)=\sum\limits_{1\le a<b\le n,gcd(a,b)=1,a+b>=n}\frac{1}{ab} f(n)=1a<bn,gcd(a,b)=1,a+b>=nab1

题解:
以下均基于 n ≥ 2 n \ge 2 n2
(1)

f ( n ) = ∑ 1 ≤ a < b ≤ n , g c d ( a , b ) = 1 , a + b > = n 1 a b f(n)=\sum\limits_{1\le a<b\le n,gcd(a,b)=1,a+b>=n}\frac{1}{ab} f(n)=1a<bn,gcd(a,b)=1,a+b>=nab1
 
 
f ( n − 1 ) = ∑ 1 ≤ a < b ≤ n − 1 , g c d ( a , b ) = 1 , a + b > = n − 1 1 a b f(n-1)=\sum\limits_{1\le a<b\le n-1,gcd(a,b)=1,a+b>=n-1}\frac{1}{ab} f(n1)=1a<bn1,gcd(a,b)=1,a+b>=n1ab1
 
 
(2) 考虑 f ( n ) f(n) f(n) f ( n − 1 ) f(n-1) f(n1)相差了啥。
 

f ( n ) = f ( n − 1 ) + ∑ 1 ≤ a < n , g c d ( a , n ) = 1 1 a n − ∑ 1 ≤ a < b ≤ n − 1 , g c d ( a , b ) = 1 , a + b = n − 1 1 a b f(n)=f(n-1)+\sum\limits_{1\le a<n,gcd(a,n)=1}\frac{1}{an}-\sum\limits_{1\le a<b\le n-1,gcd(a,b)=1,a+b=n-1}\frac{1}{ab} f(n)=f(n1)+1a<n,gcd(a,n)=1an11a<bn1,gcd(a,b)=1,a+b=n1ab1

其中
①、 ∑ 1 ≤ a < n , g c d ( a , n ) = 1 1 a n \sum\limits_{1\le a<n,gcd(a,n)=1}\frac{1}{an} 1a<n,gcd(a,n)=1an1 f ( n ) f(n) f(n) f ( n − 1 ) f(n-1) f(n1) 多的 b = n b=n b=n 的那一些,因为 n ≥ 2 n\ge2 n2,所以上式又等于 ∑ 1 ≤ a ≤ n , g c d ( a , n ) = 1 1 a n \sum\limits_{1\le a\le n,gcd(a,n)=1}\frac{1}{an} 1an,gcd(a,n)=1an1
 

②、 ∑ 1 ≤ a < b ≤ n − 1 , g c d ( a , b ) = 1 , a + b = n − 1 1 a b \sum\limits_{1\le a<b\le n-1,gcd(a,b)=1,a+b=n-1}\frac{1}{ab} 1a<bn1,gcd(a,b)=1,a+b=n1ab1 f ( n ) f(n) f(n) f ( n − 1 ) f(n-1) f(n1)少的 a + b = = n − 1 a+b==n-1 a+b==n1那一些
 

(3)
我们设 g ( n ) = ∑ 1 ≤ a < b ≤ n , g c d ( a , b ) = 1 , a + b = n 1 a b g(n)=\sum\limits_{1\le a<b\le n,gcd(a,b)=1,a+b=n}\frac{1}{ab} g(n)=1a<bn,gcd(a,b)=1,a+b=nab1
 
那么
g ( n ) = ∑ 1 ≤ a < b ≤ n , g c d ( a , b ) = 1 , a + b = n 1 a b = 1 n ∑ 1 ≤ a < b ≤ n , g c d ( a , b ) = 1 , a + b = n ( 1 a + 1 b ) g(n)=\sum\limits_{1\le a<b\le n,gcd(a,b)=1,a+b=n}\frac{1}{ab}=\frac{1}{n}\sum\limits_{1\le a<b\le n,gcd(a,b)=1,a+b=n}(\frac{1}{a}+\frac{1}{b}) g(n)=1a<bn,gcd(a,b)=1,a+b=nab1=n11a<bn,gcd(a,b)=1,a+b=n(a1+b1)

由更相减损 g c d ( a , b ) = g c d ( a − b , b ) = g c d ( a , b − a ) gcd(a,b)=gcd(a-b,b)=gcd(a,b-a) gcd(a,b)=gcd(ab,b)=gcd(a,ba) 得到 g c d ( a , b ) = g c d ( a , n ) = g c d ( b , n ) = 1 gcd(a,b)=gcd(a,n)=gcd(b,n)=1 gcd(a,b)=gcd(a,n)=gcd(b,n)=1

那么
g ( n ) = 1 n ∑ 1 ≤ a ≤ n , g c d ( a , n ) = 1 1 a g(n)=\frac{1}{n}\sum\limits_{1\le a \le n,gcd(a,n)=1}\frac{1}{a} g(n)=n11an,gcd(a,n)=1a1
 
但是 g ( 2 ) = 0 , n = 2 g(2)=0,n=2 g(2)=0,n=2时比较特殊,也就是说,n=2时并不符合上式,但是我们下文中的 g ( 2 ) = 0 g(2)=0 g(2)=0符合要求。

(4) 我们发现了啥。

f ( n ) = ∑ 1 ≤ a < b ≤ n , g c d ( a , b ) = 1 , a + b > = n 1 a b f(n)=\sum\limits_{1\le a<b\le n,gcd(a,b)=1,a+b>=n}\frac{1}{ab} f(n)=1a<bn,gcd(a,b)=1,a+b>=nab1
 

g ( n ) = ∑ 1 ≤ a < b ≤ n , g c d ( a , b ) = 1 , a + b = n 1 a b g(n)=\sum\limits_{1\le a<b\le n,gcd(a,b)=1,a+b=n}\frac{1}{ab} g(n)=1a<bn,gcd(a,b)=1,a+b=nab1

f ( n ) = f ( n − 1 ) + g ( n ) − g ( n − 1 ) = f ( n − 2 ) + g ( n − 1 ) − g ( n − 2 ) + g ( n ) − g ( n − 1 ) = f ( n − 2 ) + g ( n ) − g ( n − 2 ) = f ( n − 3 ) + g ( n ) − g ( n − 3 ) = . . . = f ( 2 ) − g ( 2 ) + g ( n ) f(n)\\=f(n-1)+g(n)-g(n-1)\\=f(n-2)+g(n-1)-g(n-2)+g(n)-g(n-1)=f(n-2)+g(n)-g(n-2)\\=f(n-3)+g(n)-g(n-3)\\=...\\=f(2)-g(2)+g(n) f(n)=f(n1)+g(n)g(n1)=f(n2)+g(n1)g(n2)+g(n)g(n1)=f(n2)+g(n)g(n2)=f(n3)+g(n)g(n3)=...=f(2)g(2)+g(n)

f ( 2 ) = 1 2 , g ( 2 ) = 0 f(2)=\frac{1}{2},g(2)=0 f(2)=21,g(2)=0

f ( n ) = 1 2 + g ( n ) f(n)=\frac{1}{2}+g(n) f(n)=21+g(n)
 

(5) 转化为求 g ( n ) g(n) g(n)

g ( n ) = 1 n ∑ 1 ≤ a ≤ n , g c d ( a , n ) = 1 1 a g(n)=\frac{1}{n}\sum\limits_{1\le a \le n,gcd(a,n)=1}\frac{1}{a} g(n)=n11an,gcd(a,n)=1a1

注意到, g ( 2 ) g(2) g(2)不满足上式,又 n ≥ 2 n\ge2 n2,所以其余的 n 均满足上式。

对于任意的正整数 n , ∑ d ∣ n μ ( d ) = [ n = 1 ] − − > n = 1 时 ∑ d ∣ n μ ( d ) = 1 , n ≠ 1 时 ∑ d ∣ n μ ( d ) = 0 n,\sum_{d|n}\mu(d)=[n=1]-->n=1时\sum_{d|n}\mu(d)=1,n\ne1时\sum_{d|n}\mu(d)=0 n,dnμ(d)=[n=1]>n=1dnμ(d)=1n=1dnμ(d)=0

g ( n ) = 1 n ∑ i = 1 n 1 i ∑ d ∣ g c d ( i , n ) μ ( d ) g(n)=\frac{1}{n}\sum\limits_{i=1}^n\frac{1}{i}\sum\limits_{d|gcd(i,n)}\mu(d) g(n)=n1i=1ni1dgcd(i,n)μ(d)

转换一下枚举顺序,先枚举 d ∣ g c d ( i , n ) d|gcd(i,n) dgcd(i,n)

g ( n ) = 1 n ∑ d ∣ g c d ( i , n ) μ ( d ) ∑ i = 1 n 1 i g(n)=\frac{1}{n}\sum\limits_{d|gcd(i,n)}\mu(d)\sum\limits_{i=1}^n\frac{1}{i} g(n)=n1dgcd(i,n)μ(d)i=1ni1

g ( n ) = 1 n ∑ d ∣ n μ ( d ) ∑ i = 1 n [ d ∣ i ] 1 i g(n)=\frac{1}{n}\sum\limits_{d|n}\mu(d)\sum\limits_{i=1}^n[d|i]\frac{1}{i} g(n)=n1dnμ(d)i=1n[di]i1
其中 [ d ∣ i ] [ d | i ] [di] 表示 d 能整除 i 时为1,否则为0。
1 − − n 中 有 ⌊ n d ⌋ 个 i 可 以 被 d 整 除 1--n中有 \lfloor\dfrac{n}{d}\rfloor个i可以被 d 整除 1ndnid

g ( n ) = 1 n ∑ d ∣ n μ ( d ) ∑ i = 1 ⌊ n d ⌋ 1 i ∗ d g(n)=\frac{1}{n}\sum\limits_{d|n}\mu(d)\sum\limits_{i=1}^{\lfloor\dfrac{n}{d}\rfloor}\frac{1}{i*d} g(n)=n1dnμ(d)i=1dnid1

我们设 s ( n ) = ∑ i = 1 n 1 i s(n)=\sum\limits_{i=1}^n\frac{1}{i} s(n)=i=1ni1

那么有 g ( n ) = 1 n ∑ d ∣ n μ ( d ) d ∗ s ( ⌊ n d ⌋ ) g(n)=\frac{1}{n}\sum\limits_{d|n}\frac{\mu(d)}{d}*s(\lfloor\dfrac{n}{d}\rfloor) g(n)=n1dndμ(d)s(dn)

(6)莫比乌斯函数 μ \mu μ

当 N 包含相等的质因子时 μ ( N ) = 0 \mu(N)=0 μ(N)=0,当 N 所包含的质因子各不相同时,若 N 有偶数个质因子 μ ( N ) = 1 \mu(N)=1 μ(N)=1,若 N 有奇数个质因子 μ ( N ) = − 1 \mu(N)=-1 μ(N)=1

(7)总结题解:
我们需要开一个长度为1e8的数组,维护前缀和 s。int 大约需要380M。
对于每一个n,我们首先要注意到,如果 n=2,那么无法套用公式求解,最终答案为 1/2。
如果 n!=2,那么我们对n进行唯一分解,枚举 n 的质因子的组合即可。其中每个质因子在每个因子中最多只出现一次即可,因为当 N 包含相等的质因子时 μ = 0 \mu=0 μ=0
时间复杂度 O ( n + t ∗ n ) O(n+t*\sqrt n) O(n+tn )

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
#define ui unsigned int
#define ll long long
#define llu unsigned ll
#define ld long double
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
#define len(x)  (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
using namespace std;

const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=998244353;
const double eps=1e-8;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=100000001;
const int maxm=100100;
const int up=100000;

int inv[maxn],fac[40];
int cnt=0,ans=0,n;

void only(int x)
{
    cnt=0;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i!=0) continue;
        fac[++cnt]=i;
        while(x%i==0) x/=i;
    }
    if(x>1) fac[++cnt]=x;
}

void dfs(int now,int d,int mu)
{
    if(now==cnt+1)
    {
        ans=(ans+1ll*mu*(inv[d]-inv[d-1])*inv[n/d]%mod+mod)%mod;
        return ;
    }
    dfs(now+1,d,mu);
    dfs(now+1,d*fac[now],mu*(-1));
}

int main(void)
{
    inv[1]=1;
    for(int i=2;i<maxn;i++)
        inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
    for(int i=2;i<maxn;i++)
        inv[i]=(inv[i-1]+inv[i])%mod;

    int tt;
    scanf("%d",&tt);
    while(tt--)
    {
        scanf("%d",&n);
        if(n==2)
        {
            printf("%d\n",(inv[2]-inv[1]+mod)%mod);
            continue;
        }
        only(n);
        ans=0;
        dfs(1,1,1);
        ans=1ll*ans*(inv[n]-inv[n-1]+mod)%mod;
        ans=((ans+inv[2]-inv[1])%mod+mod)%mod;
        printf("%d\n",ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值