专栏文章

P12599

P12599题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@mip0xo9o
此快照首次捕获于
2025/12/03 04:21
3 个月前
此快照最后确认于
2025/12/03 04:21
3 个月前
查看原文

题解

你好。
莫比乌斯函数为积性函数,因此有 μ(ij)=μ(i)μ(j)\mu(ij) = \mu(i)\mu(j) 当且仅当 gcd(i,j)=1\gcd(i,j)=1 时成立。
所以这个式子可以化为
i=1nj=1nμ(i)μ(j)ij[gcd(i,j)=1]\sum_{i=1}^{n}\sum_{j=1}^{n} \mu(i)\mu(j)ij[\gcd(i,j)=1]
然后因为 ε(x)=dxμ(x)\varepsilon(x)=\sum_{d \mid x} \mu(x)ε(1)=1\varepsilon(1)=1,所以这个式子又变了。
i=1nj=1nμ(i)μ(j)ijdi,djμ(d)\sum_{i=1}^{n}\sum_{j=1}^{n}\mu(i)\mu(j)ij \sum_{d \mid i,d \mid j} \mu(d)
然后因为 di,djd \mid i,d \mid j,因此设 i=dx,j=dyi=dx,j=dy,转化得
&=\sum_{d=1}^{n}\mu(d)\sum_{x=1}^{\lfloor{\frac{n}{d}}\rfloor} xd \cdot \mu(xd) \sum_{y=1}^{\lfloor{\frac{n}{d}}\rfloor} yd \cdot \mu(yd) \end{aligned}$$ 注意到出现了两个形式上一样的式子,直接合并。 $$=\sum_{d=1}^{n}\mu(d)(\sum_{i=1}^{\lfloor{\frac{n}{d}}\rfloor} id \cdot \mu(id))^{2}$$ 设 $f(x,y)=\sum_{i=1}^{y} xi \cdot \mu(xi)$。 所以 $$=\sum_{d=1}^{n}\mu(d)f^{2}(d,\lfloor\frac{n}{d}\rfloor)$$ 发现 $f(x,y)=f(x,y-1)+xy \cdot \mu(xy)$。 然后就可以把 $f$ 预处理出来了。 再运用前缀和和数论分块,此题完结。 ## 代码 ```cpp #include <bits/stdc++.h> #define ll long long using namespace std; const int N=1e6; const ll p=998244353; int t,n; int mu[N+2],prime[N+2],cnt; ll ans; bool isp[N+2]; vector<ll> f[N+2],sum[N+2]; int main() { mu[1]=1; for(int i=2;i<=N;i++) { if(!isp[i]) prime[++cnt]=i,mu[i]=-1; for(int j=1;j<=cnt&&i*prime[j]<=N;j++) { isp[i*prime[j]]=1; if(i%prime[j]==0) break; mu[i*prime[j]]=-mu[i]; } } f[0].resize(N); for(int i=1;i<=N;i++) { f[i].resize(N/i+2); for(int j=1;j<=N/i;j++) f[i][j]=(f[i-1][j]+mu[i*j]*i*j%p)%p; } for(int i=1;i<=N;i++) { sum[i].resize(N/i+2); for(int j=1;j<=N/i;j++) sum[i][j]=(sum[i][j-1]+mu[j]*f[i][j]*f[i][j]%p)%p; } scanf("%d",&t); while(t--) { scanf("%d",&n); ans=0ll; for(int l=1,r;l<=n;l=r+1) { r=n/(n/l); ans=(ans+sum[n/l][r]-sum[n/l][l-1])%p; } printf("%lld\n",(ans+p)%p); } return 0; } ```

评论

2 条评论,欢迎与作者交流。

正在加载评论...