获奖名单
前三:
rank1:@GZY_GZY
rank2:@ljc1301
rank3:@加藤惠
orz三位dalao!tql!
一血榜:
A: @ThinkofBlank(09:05:39)
B: @muller(09:08:57)
C: @GZY_GZY(11:34:05)
D: @东师附中大头(10:57:32)
E: @GZY_GZY(18:29:35获得最高分58pts)
吐槽
谁知道我元旦想放水题放出锅了啊……T2据说是和别人差不多的题……对此我深表歉意。(既然这是基本全场AC的签到题大家就放我一马吧,感激不尽2333)
其它题应该没啥问题。
总体评估
T1,T2简单题,T3,T4稍有难度,T5较难(可能不太准?)部分分放的真的好多好多啊……
好了废话不多说,放题解。
T1 WD与矩阵
subtask1:
暴力即可。复杂度 O ( T 2 n m ) O(T2^{nm}) O(T2nm)。
subtask2:
这个部分分是脑子一抽给的,肯定没人写。直接枚举列,把行的状态状压起来就行。复杂度 O ( T m 2 2 n ) O(Tm2^{2n}) O(Tm22n)。
subtask3:
打表应该都能发现,答案就是 2 ( n − 1 ) ( m − 1 ) 2^{(n-1)(m-1)} 2(n−1)(m−1),因为我们可以最后一行和最后一列完全可以根据前面填的值直接算出来,因此任意排列前面的东西即可。复杂度 O ( T l o g n ) O(Tlogn) O(Tlogn)。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
ll modpow(ll a, ll b) {
ll res = 1;
for (; b; b >>= 1) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
}
return res;
}
int main(){
int n, m, T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
printf("%lld\n", modpow(2, (ll)(n - 1) * (m - 1)));
}
return 0;
}
T2 WD与循环
subtask1:
我们会显然的发现问题转化为求有多少种不同的值使
∑
i
=
1
n
a
i
≤
m
\sum_{i=1}^na_i\le m
∑i=1nai≤m。因此这个直接dp即可。
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示当前到第
i
i
i个循环,前面值的和为
j
j
j的方案数,最后就是
∑
i
=
0
m
f
[
n
]
[
i
]
\sum_{i=0}^mf[n][i]
∑i=0mf[n][i],复杂度
O
(
n
m
+
T
)
O(nm+T)
O(nm+T).
subtask2:
发现有不等号不太方便,考虑如果是等号怎么做。这是显然的插板法(如果不知道可以度娘……),也就是说
∑
i
=
1
n
a
i
=
m
\sum_{i=1}^na_i=m
∑i=1nai=m的非负解共有
(
n
+
m
−
1
n
−
1
)
\binom{n+m-1}{n-1}
(n−1n+m−1)组,因为我们可以视为在
m
m
m个数中加上
n
−
1
n-1
n−1个可相邻的隔板,相邻两个隔板之间的长度就代表了对应的数字。
因此我们预处理阶乘,直接枚举
m
m
m计算对应的组合数,然后求和即可。复杂度
O
(
T
m
+
m
o
d
)
O(Tm+mod)
O(Tm+mod)。
subtask3:
有个结论,就是:
∑
i
=
q
n
(
i
q
)
=
(
n
+
1
q
+
1
)
\sum_{i=q}^n \binom{i}{q}=\binom{n+1}{q+1}
i=q∑n(qi)=(q+1n+1)
简略证明如下:
∑
i
=
q
n
(
i
q
)
=
(
n
q
)
+
(
n
q
+
1
)
即
∑
i
=
q
n
−
1
(
i
q
)
=
(
n
q
+
1
)
\sum_{i=q}^n\binom{i}{q}=\binom{n}{q}+\binom{n}{q+1}即\sum_{i=q}^{n-1}\binom{i}{q}=\binom{n}{q+1}
i=q∑n(qi)=(qn)+(