由于找不到提交网站,所以不保证正确性哦~
problem
已知积性函数 F(1)=1,F(pk)=pk+1F(1)=1,F(p^k)=p^k+1F(1)=1,F(pk)=pk+1。(ppp为质数,k∈Z+k∈Z^+k∈Z+)
给定 nnn,求 ∑i=1nF(i)\sum_{i=1}^n F(i)∑i=1nF(i) 。
答案对 998244353998244353998244353 取模。
input:6
output:31
100%数据:n≤1012n≤10^{12}n≤1012。
solution
f(n)=∑i∣ni[(i,ni)=1]f(n)=\sum_{i\mid n}i[(i,\frac ni)=1] f(n)=i∣n∑i[(i,in)=1]
∑i=1nf(i)=∑i=1n∑j∣ij[(j,ij)=1]=∑i=1n∑j∣ij∑d∣j∧d∣ijμ(d)\sum_{i=1}^n f(i)=\sum_{i=1}^n\sum_{j\mid i}j[(j,\frac ij)=1]=\sum_{i=1}^n\sum_{j|i}j\sum_{d\mid j\wedge d\mid \frac ij}\mu(d) i=1∑nf(i)=i=1∑nj∣i∑j[(j,ji)=1]=i=1∑nj∣i∑jd∣j∧d∣ji∑μ(d)
ddd 既是 jjj 的因数又是 ij\frac ijji 的因数,所以最大不会超过 n\sqrt nn。
∑d=1nμ(d)∑j=1ndjd∑i(jd)d≤n=∑d=1nμ(d)d∑i=1nd2∑j=1⌊nd2i⌋j\sum_{d=1}^{\sqrt n}\mu(d)\sum_{j=1}^{\frac{n}{d}}jd\sum_{i(jd)d\le n}=\sum_{d=1}^{\sqrt n}\mu(d)d\sum_{i=1}^{\frac{n}{d^2}}\sum_{j=1}^{\lfloor\frac{n}{d^2i}\rfloor}j d=1∑nμ(d)j=1∑dnjdi(jd)d≤n∑=d=1∑nμ(d)di=1∑d2nj=1∑⌊d2in⌋j
数论分块,∑j=1⌊nd2i⌋j\sum_{j=1}^{\lfloor\frac{n}{d^2i}\rfloor}j∑j=1⌊d2in⌋j 就是等差数列计算。
积分时间复杂度为 O(nlogn)O(\sqrt n\log n)O(nlogn)。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 1000005
#define mod 998244353
int prime[maxn], mu[maxn];
bool vis[maxn];
int cnt;void sieve( int n ) {mu[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt and i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {mu[i * prime[j]] = 0;break;}else mu[i * prime[j]] = -mu[i];}}
}int calc( int x ) { return x * ( x + 1 ) / 2 % mod; }int solve( int n ) {int ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {r = n / ( n / l );( ans += ( r - l + 1 ) * calc( n / l ) % mod ) %= mod;}return ans;
}signed main() {int n;scanf( "%lld", &n );int m = sqrt( n );sieve( m );int ans = 0;for( int d = 1;d <= m;d ++ ) ( ans += mu[d] * d % mod * solve( n / d / d ) % mod ) %= mod;printf( "%lld\n", ( ans + mod ) % mod );return 0;
}