传送门:https://nanti.jisuanke.com/t/42386
题意
设 f a ( x ) = a x , 求 解 设f_a(x)=a^x,求解 设fa(x)=ax,求解
∑ a = 2 n ( a ∑ b = a n ⌊ f a − 1 ( b ) ⌋ ⌈ f b − 1 ( a ) ⌉ ) m o d 998244353 \sum_{a=2}^n\left ( a\sum_{b=a}^n\left \lfloor f_a^{-1}(b) \right \rfloor\left \lceil f_b^{-1}(a)\right \rceil \right ) mod\;998244353 a=2∑n(ab=a∑n⌊fa−1(b)⌋⌈fb−1(a)⌉)mod998244353
思路
根 据 f a − 1 ( x ) = log a x 可 知 , 原 式 等 于 根据f_a^{-1}(x)=\log_a^x可知,原式等于 根据fa−1(x)=logax可知,原式等于
∑ a = 2 n ( a ∑ b = a n ⌊ log a b ⌋ ⌈ log b a ⌉ ) \sum_{a=2}^n\left ( a\sum_{b=a}^n\left \lfloor \log_a^{b}\right \rfloor\left \lceil \log_b^a\right \rceil \right ) a=2∑n(ab=a∑n⌊logab⌋⌈logba⌉)
因 为 b ≥ a , 所 以 ⌈ log b a ⌉ = 1 , 即 因为b\ge a,所以\left \lceil \log_b^a\right \rceil=1,即 因为b≥a,所以⌈logba⌉=1,即
∑ a = 2 n ( a ∑ b = a n ⌊ log a b ⌋ ) \sum_{a=2}^n\left ( a\sum_{b=a}^n\left \lfloor \log_a^{b}\right \rfloor \right ) a=2∑n(ab=a∑n⌊logab⌋)
接 下 来 考 虑 log a b 的 贡 献 , 我 们 知 道 log a a = 1 , log a a 2 = 2 , log a a k = k . 接下来考虑\log_a^b的贡献,我们知道\log_a^a=1,\log_a^{a^2}=2,\log_a^{a^k}=k. 接下来考虑logab的贡献,我们知道logaa=1,logaa2=2,logaak=k.
而 这 些 有 多 少 个 呢 ? 1 有 a 2 − a 个 , 2 有 a 3 − a 2 个 . . . 而这些有多少个呢?1有a^2-a个,2有a^3-a^2个... 而这些有多少个呢?1有a2−a个,2有a3−a2个...
所 以 对 于 a 2 < n 的 , 遍 历 次 幂 计 算 贡 献 。 所以对于a^2<n的,遍历次幂计算贡献。 所以对于a2<n的,遍历次幂计算贡献。
对 于 a 2 > n , 只 有 1 这 个 贡 献 , 所 以 我 们 只 要 遍 历 n 即 可 , n = 1 e 12 , v e r y g o o d ! 对于a^2>n,只有1这个贡献,所以我们只要遍历\sqrt n即可,n=1e12,very \;good! 对于a2>n,只有1这个贡献,所以我们只要遍历n即可,n=1e12,verygood!
不 过 对 于 a ∗ a = n , 有 a 2 − a 个 1 , 和 1 个 2 , 另 外 计 算 即 可 。 不过对于a*a=n,有a^2-a个1,和1个2,另外计算即可。 不过对于a∗a=n,有a2−a个1,和1个2,另外计算即可。
对 于 a ∗ a > n , 贡 献 为 a ∗ ( n − a + 1 ) + ( a + 1 ) ∗ ( n − a ) + . . . + n ∗ 1 = ∑ a = n + 1 n a ∗ ( n − a + 1 ) 对于a*a>n,贡献为a*(n-a+1)+(a+ 1)*(n-a)+...+n*1=\sum_{a=\sqrt n+1}^na*(n-a+1) 对于a∗a>n,贡献为a∗(n−a+1)+(a+1)∗(n−a)+...+n∗1=∑a=n+1na∗(n−a+1)
这 一 部 分 为 : 这一部分为: 这一部分为:
1 2 ( n + 1 ) ( n + 1 + n ) ( n − n ) + 1 6 ( n ( n + 1 ) ( 2 n + 1 ) − ( n − 1 ) ( n ) ( 2 n − 1 ) ) \frac{1}{2}(n+1)(\sqrt n+1+n)(n-\sqrt n)+\frac{1}{6}(n(n+1)(2n+1)-(\sqrt n-1)(\sqrt n)(2\sqrt n-1)) 21(n+1)(n+1+n)(n−n)+61(n(n+1)(2n+1)−(n−1)(n)(2n−1))
最 后 整 合 计 算 即 可 。 最后整合计算即可。 最后整合计算即可。
复 杂 度 为 O ( n ) 。 复杂度为O(\sqrt n)。 复杂度为O(n)。
Code
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
const ll mod = 998244353;
ll quick_pow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans % mod;
}
void solve() {
ll n; cin >> n;
ll ans = 0;
ll a = 2;
for( ;a * a <= n; a++) {
if(a * a == n) {
ans = (ans + a * ((n - a + 2) % mod) % mod) % mod; // a * a == n
}
else {
ll t = a;
ll k = 1;
while(t * a <= n) {
ans = (ans + t * (a - 1) % mod * a % mod * k % mod) % mod;
t = t * a;
k++;
}
ans = (ans + (n - t + 1) % mod * a % mod * k % mod) % mod;
}
}
ll inv2 = quick_pow(2, mod - 2);
ll inv6 = quick_pow(6, mod - 2);
// 后面的a都是只有1的贡献
ans = (ans + ((n + 1) % mod) * ((n - a + 1) % mod) % mod * ((a + n) % mod) % mod * inv2 % mod) % mod;
ans = (ans - (n % mod) * ((n + 1) % mod) % mod * ((2ll * n + 1) % mod) % mod * inv6 % mod + (a - 1) * a % mod * (2ll * a - 1) % mod * inv6 % mod) % mod;
cout << (ans % mod + mod) % mod << endl;
}
signed main() {
solve();
}