洛谷的专题qwqqqqq(乱序按心情做也不一定做得完= =)
三分钟热度就有三分钟的收获_(:з」∠)_
但是我永远喜欢算法
组合数学的灵魂大概就是原公式和3条性质叭qwq(混乱发言)
还有个二项式定理、Lucas定理和catalan数来着
蓝皮书上有,此处不多加赘述。
P2822 [NOIP2016 提高组] 组合数问题
思路:因为数据范围较小,但是询问次数较多,所以可以先预处理出所有结果,再处理询问。这里比较神奇的转换就是,可以将k整除变成 % k == 0,在求组合数的时候直接mod k,然后处理答案的时候看是否为0即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int k;
int c[2010][2010];
int ans[2010][2010];
void init()
{
for(int i = 0;i <= 2000; i++)
{
for(int j = 0;j <= i; j++)
{
if(!j) c[i][j] = 1;
else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k;
}
}
for(int i = 2;i <= 2000; i++)
{
for(int j = 1;j <= 2000; j++)
{
ans[i][j] = ans[i - 1][j] + ans[i][j - 1] - ans[i - 1][j - 1];
if(!c[i][j]) ans[i][j] ++;
}
ans[i][i + 1] = ans[i][i];
}
}
int main()
{
int t;
scanf("%d%d", &t, &k);
init();
while(t--)
{
int n, m;
scanf("%d%d", &n, &m);
if(m > n) printf("%d\n", ans[n][n]);
else printf("%d\n", ans[n][m]);
}
return 0;
}
P1044 [NOIP2003 普及组] 栈
思路:裸的catalan数应用,快乐水题。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
ll c[40][40];
void init()
{
for(int i = 0;i <= 36; i++)
{
for(int j = 0;j <= i; j++)
{
if(!j) c[i][j] = 1;
else c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
}
}
}
int main()
{
int n;
init();
cin >> n;
cout << c[2 * n][n] / (n + 1) << endl;
return 0;
}
P2525 Uim的情人节礼物·其之壱
思路:STL nb!在algorithm里有求全排列的前一个序列和后一个序列的函数,直接用就好啦。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[11];
int main()
{
int n;
cin >> n;
for(int i = 0;i < n; i++) cin >> a[i];
if(!prev_permutation(a, a + n)) cout << "ERROR" << endl;
else
{
for(int i = 0;i < n; i++) cout << a[i] << ' ';
}
return 0;
}