CF1561D1 题解

link

你有一个数 ,问有多少种执行一下操作的方案,使 变成

  • 减去一个在 的值

  • 除以一个 的值并向下取整。

注意减或除的 不一样方案也不同,方案数对质数 取模。

为什么不直接写 D2 题解,因为我不会呀.

表示 时的答案。显然

前面减的部分可以直接前缀和算,问题是后面部分。

然后的形式非常是整除分块的形式,可以用整除分块 求。

时间复杂度

CODE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;
#define int long long

inline int read() {
int x = 0, f = 0; char c = 0;
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) x = (x << 3) + (x << 1) + (c & 15), c = getchar();
return f ? -x : x;
}

#define N 200010

int n, P, f[N];

signed main() {
n = read(), P = read();
f[1] = 1;
int now = 1;
for (int i = 2; i <= n; i ++) {
f[i] = now;
for (int l = 2, r; l <= i; l = r + 1) {
r = i / (i / l);
(f[i] += (r - l + 1) % P * f[i / l] % P) %= P;
}
now = (now + f[i]) % P;
}
printf("%lld\n", f[n]);
return 0;
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!