CF1561D1 题解
你有一个数 ,问有多少种执行一下操作的方案,使 变成
将 减去一个在 的值
将 除以一个 的值并向下取整。
注意减或除的 不一样方案也不同,方案数对质数 取模。
为什么不直接写 D2 题解,因为我不会呀.
设 表示 时的答案。显然
前面减的部分可以直接前缀和算,问题是后面部分。
然后的形式非常是整除分块的形式,可以用整除分块 求。
时间复杂度 。
CODE
#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;
}
CF1561D1 题解
https://ybwa.github.io/p/eb319da4/