2021.08.09【NOIP提高B组】模拟
赛时
T1
感觉可以骗分。
思路如下:
在 b串 里面寻找回文子序列,再判断这个子序列是否是 a串 和 b串 的公共子序列。
如果成立,那么就取 \(max\) 这个子序列的长度
T2
感觉不可做
T3
前缀和乱水
T4
神仙题,显然不可做
赛后
得分 100 + 0 + 30 + 0
后面发现 T3 要用二分答案
而且 T4 也不是什么神仙题,虽然赛时没几个人 A 了, 但是赛后没一会就一大堆人 A 了。
所以在询问大佬的帮助下,最后可以得出今天题目的 AC 做法
T1
同赛时
T2
对于一个闭环,就缩点,把图变成一个有向无环图,再就是 DP.
T3
乱搞前缀和和二分
T4
洛谷 \(link\)
组合数学
请各位理性理解
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, k;
int main ()
{
freopen ("color.in", "r", stdin);
freopen ("color.out", "w", stdout);
scanf ("%lld%lld", &n, &k);
ll as = k * (k - 1) / 2, sa = k * (k - 1) * (k - 2) / 6;
if (n == 1) printf ("%lld", as * 2 + sa * (3 * (1 << 19) - 6));
if (n == 2) printf ("%lld", sa * 96);
if (n == 3) printf ("%lld", as * 2 + sa * 18);
if (n == 4) printf ("%lld", as * 2 + sa * (3 * (1 << 13) - 6));
if (n == 5) printf ("%lld", sa * 12);
if (n == 6) printf ("%lld", sa * 6);
if (n == 7) printf ("%lld", sa * 96);
if (n == 8) printf ("%lld", as * 2 + sa * 1073741820);
return 0;
}