专栏文章

P13679 [IAMOI R2] 传奇模数题解

P13679题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@miodqnwq
此快照首次捕获于
2025/12/02 17:32
3 个月前
此快照最后确认于
2025/12/02 17:32
3 个月前
查看原文

P13679 [IAMOI R2] 传奇模数

分析

M=998244353M = 998244353
  1. n<Mn < M
    此时整体贡献值为 00。因为整体是向下取整,当 n<Mn < M 的时候,每一个分数的值都是 00,没有任何贡献
  2. Mn<2MM \le n < 2M
    此时整体贡献值为 (nM+1)modM(n - M + 1) \mod M。在 i=MniM\sum_{i = M}^n \lfloor \frac{i}{M} \rfloor 中,每个 ii 的贡献值都为 11,所以 [M,n][M,n] 的贡献值就是区间长度 nM+1n - M + 1。并且当 n=2M1n = 2M - 1 时,nM+1=Mn - M + 1 = M,所以需要取模。
  3. 2Mn<3M2M \le n < 3M: 此时整体贡献值为 (n2M+1)×2modM(n - 2M + 1) \times 2 \mod M。首先,区间 [0,2M)[0,2M) 的整体贡献值为 00。这个在上个区间的分析中提到过。所以我们只需要计算 [2M,n][2M, n] 的贡献值即可。i=2MniM\sum_{i = 2M}^n \lfloor \frac{i}{M} \rfloor 中,每个 ii 的贡献值都为 22,所以 [2M,n][2M, n] 的贡献值就是 (n2M+1)×2(n - 2M + 1) \times 2。当 n=3M1n = 3M - 1 时,(n2M+1)×2=2M(n - 2M + 1) \times 2 = 2M,所以也需要取模。
以此类推,我们可以推到 kMn<(k+1)MkM \le n < (k + 1)M 的区间,其中 kk 是一个非负整数。此时 [0,kM)[0,kM) 的贡献值为 00[kM,n][kM, n] 的贡献值为 (nkM+1)×kmodM(n - kM + 1) \times k \mod M。最后整体贡献值就为 (nkM+1)×kmodM(n - kM + 1) \times k \mod M
最后注意 n1018n \le 10^{18},记得开 long long

代码

所有的变量意义同上。
CPP
#include <bits/stdc++.h>

using namespace std;
#define ll long long

ll n;
const int M = 998244353;

int main(){
    cin >> n;
    ll k = n / M;//区间长度
    cout << (k * (n - k * M + 1)) % M << endl;
    return 0;
}

评论

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

正在加载评论...