2019年ICPC银川 Function!推柿子

2019年ICPC Function!推柿子

传送门: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=2n(ab=anfa1(b)fb1(a))mod998244353

思路

根 据 f a − 1 ( x ) = log ⁡ a x 可 知 , 原 式 等 于 根据f_a^{-1}(x)=\log_a^x可知,原式等于 fa1(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=2n(ab=anlogablogba)

因 为 b ≥ a , 所 以 ⌈ log ⁡ b a ⌉ = 1 , 即 因为b\ge a,所以\left \lceil \log_b^a\right \rceil=1,即 balogba=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=2n(ab=anlogab)

接 下 来 考 虑 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. logablogaa=1,logaa2=2,logaak=k.

而 这 些 有 多 少 个 呢 ? 1 有 a 2 − a 个 , 2 有 a 3 − a 2 个 . . . 而这些有多少个呢?1有a^2-a个,2有a^3-a^2个... 1a2a2a3a2...

所 以 对 于 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>n1n n=1e12verygood!

不 过 对 于 a ∗ a = n , 有 a 2 − a 个 1 , 和 1 个 2 , 另 外 计 算 即 可 。 不过对于a*a=n,有a^2-a个1,和1个2,另外计算即可。 aa=na2a112

对 于 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) aa>na(na+1)+(a+1)(na)+...+n1=a=n +1na(na+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)(nn )+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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值