题目链接

题面:

题意:
求:
f ( n ) = <munder> 1 a < b n , g c d ( a , b ) = 1 , a + b > = n </munder> 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 ) = <munder> 1 a < b n , g c d ( a , b ) = 1 , a + b > = n </munder> 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 ) = <munder> 1 a < b n 1 , g c d ( a , b ) = 1 , a + b > = n 1 </munder> 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 ) + <munder> 1 a < n , g c d ( a , n ) = 1 </munder> 1 a n <munder> 1 a < b n 1 , g c d ( a , b ) = 1 , a + b = n 1 </munder> 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

其中
①、 <munder> 1 a < n , g c d ( a , n ) = 1 </munder> 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,所以上式又等于 <munder> 1 a n , g c d ( a , n ) = 1 </munder> 1 a n \sum\limits_{1\le a\le n,gcd(a,n)=1}\frac{1}{an} 1an,gcd(a,n)=1an1
 

②、 <munder> 1 a < b n 1 , g c d ( a , b ) = 1 , a + b = n 1 </munder> 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 ) = <munder> 1 a < b n , g c d ( a , b ) = 1 , a + b = n </munder> 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 ) = <munder> 1 a < b n , g c d ( a , b ) = 1 , a + b = n </munder> 1 a b = 1 n <munder> 1 a < b n , g c d ( a , b ) = 1 , a + b = n </munder> ( 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 <munder> 1 a n , g c d ( a , n ) = 1 </munder> 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 ) = <munder> 1 a < b n , g c d ( a , b ) = 1 , a + b > = n </munder> 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 ) = <munder> 1 a < b n , g c d ( a , b ) = 1 , a + b = n </munder> 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 <munder> 1 a n , g c d ( a , n ) = 1 </munder> 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 <munder> d g c d ( i , n ) </munder> μ ( 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 <munder> d g c d ( i , n ) </munder> μ ( 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 <munder> d n </munder> μ ( 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 <mstyle displaystyle="true" scriptlevel="0"> n d </mstyle> i d 1--n中有 \lfloor\dfrac{n}{d}\rfloor个i可以被 d 整除 1ndnid

g ( n ) = 1 n <munder> d n </munder> μ ( d ) i = 1 <mstyle displaystyle="true" scriptlevel="0"> n d </mstyle> 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 <munder> d n </munder> μ ( d ) d s ( <mstyle displaystyle="true" scriptlevel="0"> n d </mstyle> ) 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;
}