传送门
枚举选几人,再枚举队长
A
N
S
=
∑
i
=
1
k
C
n
i
∗
i
∗
2
i
−
1
ANS=\sum_{i=1}^{k}C_{n}^{i}*i*2^{i-1}
ANS=∑i=1kCni∗i∗2i−1
但是这个式子计算仍需
O
(
T
n
)
O(Tn)
O(Tn)
发现模数有些特殊,
8388608
=
2
23
8388608=2^{23}
8388608=223
那么上面的式子当i>23时都是0
Code:
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
const int qy = 1 << 23;
int c[maxn][24];
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
int main(){
for (int i = 0; i <= 100000; ++i){
c[i][0] = 1;
for (int j = 1; j <= min(23, i); ++j)
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % qy;
}
int M = read();
while (M--){
int n = read(), k = read(), ans = 0;
for (int i = 1; i <= min(k, 23); ++i)
(ans += 1LL * c[n][i] * i % qy * (1 << (i - 1)) % qy) %= qy;
printf("%d\n", ans);
}
return 0;
}
本文介绍了一种利用组合数学解决特定问题的方法,并通过快速模运算优化计算过程。重点在于如何在大规模数据输入的情况下,利用特殊的模数特性来减少计算复杂度。
3133

被折叠的 条评论
为什么被折叠?



