考试复习小总结 ^_^
企鹅QQ
这道题目我写错的几个点:
1.我又把字符串数量和字符串下标搞混了,以至于把\(2e2\)和\(3e4\)放反了。考试的时候一定要注意!!!
2.一开始忘记\(ans\)在循环外还能继续累计了
for(int i=1;i<=n;i++){
if(sum[i]==sum[i-1])now++;
else{
ans+=(now*(now-1))/2;
now=1;
}
}
ans+=(now*(now-1))/2;
比较需要注意的点:\(233,238,131,137\)是比较常用的质数组合。在进制位权中最好使用\(131\)
卡特兰数板板
做法一:

这是一个比较好用的基础递推公式。我们还有两个组合数通项公式,但是暂时写不出来,因为这道题无模数,不用__int128会炸,但是我不会用那个。
然后它的前几项是:1 2 5 14 42 132
# 小贴士
如果卡特兰数的模数并不是质数,我们就悲伤地没办法使用逆元。如果没办法使用逆元……这个到时候再看吧。老师说考试不考喵。
卡特兰数穿了衣服的板板
栈
设入栈为\(A\),出栈个数为\(B\),问题就可以直接简化成卡特林数。
这里摸一种组合数新求法(除阶乘和递推之外)
#include<bits/stdc++.h>
using namespace std;
const int N=60;
typedef long long ll;
int n;
ll C(int n,int m){
ll sum=1;
for(int i=1;i<=m;i++)sum=sum*(n-m+i)/i;
return sum;
}
int main(){
cin>>n;
cout<<C(n*2,n)-C(n*2,n-1);
return 0;
}
这个式子是由组合数的公式拆开后得到的:
for(int i=1;i<=m;i++)sum=sum*(n-m+i)/i;
鸡蛋饼
这道题需要一点转换。我们发现在两个点之间连一条线会把圆切成两半,如果一个半圆只有奇数个顶点,那么最终肯定无法完成连线。所以需要确保一个点与其连接的另一个点之间必须要有偶数个节点。这个时候我们又发现题目给出的是\(2N\),所以可以直接用\(i(1\le i\le n)\)枚举第一个要连线的点与它要连线的另一个点之间相隔了多少个点,看似是\(i\),实则是\(i*2\)。最后将每个\(i\)的结果相加就是最终答案。
这道题我觉得很好的一个点是它完美的体现了我在之前某一篇博客里讲的一个“如何判断一个题目需要卡特兰数”完全相符。

另外,实现代码的时候发现如果使用\(f[k]*f[n-k-1]\)的公式的时候,由于使用的是\(k\)和\(i\)而不是\(k\)和\(n\)所以总是会写错写成\(f[i]*f[i-k-1]\)
容斥原理
错位排序板板
从理论上而言我应该对错位排序进行一个讲解。实际上而言我比较懒,所以我不干了。
#include<bits/stdc++.h>
using namespace std;
const int N=25;
typedef long long ll;
int n;
ll a[N];
int main(){
cin>>n;
a[1]=0,a[2]=1;
for(int i=3;i<=n;i++)a[i]=(a[i-1]+a[i-2])*(i-1);
cout<<a[n];
return 0;
}
容斥原理小练习
这是一道非常非常简单的小容斥。但是我当时忘记把既没有\(3\)又没有\(7\)的给加上去了。我是唐逼
kmp板板
其实我有点质疑到底要不要搞kmp,毕竟都学hash了。不过可能还是有用的吧。那还是写一下吧喵。
Trie树板板
感觉它是个没用的东西。感觉我已经忘掉了。神秘。听说有明天有图论。但是我kruskal忘掉了,塔尖也没学过qwq
浙公网安备 33010602011771号