problem1 link

左括号和右括号较少的一种不会大于20。假设左括号少。设$f[i][mask][k]$表示处理了前$i$个字符,其中留下的字符以$k$开头($k=0$表示'(',$k=1$表示'['),且所有留下的字符状态为$mask$,($mask$的最高位为1,其他位为0表示另一种括号,否则表示跟最高位相同的符号)。

problem2 link

给定$n,m$,$n$个数字的排列有$n!$种,设其中某一种为$P_{i}$,设$P_{i}$中循环的个数$f(P_{i})=t_{i}$,那么$P_{i}$对答案的贡献为$t_{i}^{m}$。设所有排列的集合为$S$,计算$\sum_{P_{i}\in S}f(P_{i})^{m}$。$1\leq n\leq 100000,0\leq m\leq 300$

给出一些定义:

(1)第一类斯特灵数:$s(n,k)$,表示将$n$个元素排列成$k$个轮换的个数,递推公式:$s(n,k)=(n-1)s(n-1,k)+s(n-1,k-1),n>0$

(2)第二类斯特灵数:$S(n,k)$,表示将$n$个元素分成$k$个非空集合的方案数,递推公式:$S(n,k)=k*S(n-1,k)+S(n-1,k-1),n>0$

(3)$x^{n}=\sum_{k=0}^{n}S(n,k)x(x-1)...(x-k+1),n\geq 0$.这个可以用数学归纳法证明。

(4)$x(x+1)...(x+n-1)=\sum_{k=0}^{n}s(n,k)x^{k},n\geq 0$.这个可以用数学归纳法证明。

==========分隔符=========

现在回到题目。需要求的是$ans=\sum_{k=0}^{n}s(n,k)k^{m}$,借助上面第(3)个公式得到:

$ans=\sum_{k=0}^{n}s(n,k)k^{m}$

$=\sum_{k=0}^{n}s(n,k)\sum_{t=0}^{m}S(m,t)k(k-1)...(k-t+1)$

$=\sum_{t=0}^{m}S(m,t)\sum_{k=0}^{n}s(n,k)k(k-1)...(k-t+1)$

现在考虑 $\sum_{k=0}^{n}s(n,k)k(k-1)...(k-t+1)$

对公式(4)两端求$t$阶导数得到:$(x(x+1)...(x+n-1))^{(t)}=\sum_{k=0}^{n}s(n,k)k(k-1)...(k-t+1)x^{k-t}$.

如果令$x=1$就得到了$\sum_{k=0}^{n}s(n,k)k(k-1)...(k-t+1)$。

现在就是需要计算$(x(x+1)...(x+n-1))^{(t)}_{x=1}$的值。

令$u=x-1$,那么就是求$((u+1)(u+2)...(u+n))^{(t)}_{u=0}$的值。

$(u+1)(u+2)...(u+n)=a_{n,0}+a_{n,1}u+...+a_{n,t}u^{t}+...+a_{n,n}u^{n}$

现在只需要计算出$a_{n,t}$即可,那么$\sum_{k=0}^{n}s(n,k)k(k-1)...(k-t+1)=a_{n,t}*t!$

下面用数学归纳法证明:$a_{n,t}=s(n+1,t+1)$.

(1)假设$t$固定,小于等于$n-1$时均成立;即$a_{n-1,t}=s(n,t+1)$.

(2)对于$(u+1)(u+2)...(u+n)中$中$u_{t}$的系数的所有项是由$n$项中选出$n-t$项的乘积组成的。那么如果某一项乘积包含$n$时,就是$n*a_{n-1,t}=n*s(n,t+1)$;如果不包含$n$,那么就是由$[1,n-1]$中任意选出$n-t$项,这其实就是$a_{n-1,t-1}=s(n,t)$。

所以$(u+1)(u+2)...(u+n-1)$中$u_{t}$的系数$a_{n,t}=n*s(n,t+1)+s(n,t)=s(n+1,t+1)$.

problem3 link

一顿乱搜。

code for problem1

#include <algorithm>
#include <cstring>
#include <string> constexpr int kMAXN = 20; long long f[2][1 << kMAXN][2]; class BracketSequenceDiv1 {
public:
long long count(std::string s) {
int n = static_cast<int>(s.size());
int num = 0;
for (int i = 0; i < n; ++i) {
if (s[i] == '(' || s[i] == '[') {
++num;
}
}
if (num > n - num) {
std::reverse(s.begin(), s.end());
for (int i = 0; i < n; ++i) {
if (s[i] == '(') {
s[i] = ')';
} else if (s[i] == ')') {
s[i] = '(';
} else if (s[i] == '[') {
s[i] = ']';
} else {
s[i] = '[';
}
}
num = n - num;
} int pre = 0, cur = 1;
memset(f[pre], 0, sizeof(f[pre]));
f[0][0][0] = 1;
for (int i = 1; i <= n; ++i) {
char c = s[i - 1];
memset(f[cur], 0, sizeof(f[cur]));
for (int j = 0; j < (1 << num); ++j) {
for (int k = 0; k < 2; ++k) {
long long p = f[pre][j][k];
if (p == 0) {
continue;
}
f[cur][j][k] += p;
if (c == '(') {
if (j == 0) {
f[cur][1][0] += p;
} else {
f[cur][j << 1 | (k ^ 1)][k] += p;
}
} else if (c == '[') {
if (j == 0) {
f[cur][1][1] += p;
} else {
f[cur][j << 1 | k][k] += p;
}
} else if (c == ')') {
if (j != 0 && (k ^ (j & 1)) != 0) {
f[cur][j >> 1][k] += p;
}
} else {
if (j != 0 && (0 == (k ^ (j & 1)))) {
f[cur][j >> 1][k] += p;
}
}
}
}
pre ^= 1;
cur ^= 1;
}
return f[pre][0][0] + f[pre][0][1] - 1;
}
};

code for problem2

#include <vector>

constexpr int N = 101000;
constexpr int kMod = 1000000007; int g[N][305]; int p[N]; int S[305][305]; class CyclesNumber {
public:
std::vector<int> getExpectation(const std::vector<int> &n,
const std::vector<int> &m) {
p[0] = 1;
for (int i = 1; i < N; ++i)
p[i] = static_cast<int>(1ll * p[i - 1] * i % kMod); S[0][0] = 1;
S[1][1] = 1;
S[2][1] = S[2][2] = 1;
for (int i = 3; i <= 300; ++i) {
for (int k = 1; k <= i; ++k) {
S[i][k] =
static_cast<int>((1ll * k * S[i - 1][k] + S[i - 1][k - 1]) % kMod);
}
} g[0][0] = 1;
g[1][1] = 1;
g[2][1] = g[2][2] = 1;
for (int i = 3; i < N; ++i) {
for (int j = 1; j <= 301; ++j) {
g[i][j] = static_cast<int>(
(1ll * (i - 1) * g[i - 1][j] + g[i - 1][j - 1]) % kMod);
}
} int num = static_cast<int>(n.size()); std::vector<int> result(num);
for (int i = 0; i < num; ++i) {
result[i] = Cal(n[i], m[i]);
}
return result;
} private:
void Add(int &x, int y) {
x += y;
if (x >= kMod) {
x -= kMod;
}
} int Cal(int n, int m) {
if (m == 0) {
return p[n];
}
if (n == 1) {
return 1;
} int ans = 0;
for (int t = 1; t <= m; ++t) {
Add(ans, static_cast<int>(1ll * S[m][t] * p[t] % kMod * g[n + 1][t + 1] %
kMod));
}
return ans;
}
};

code for problem3

#include <algorithm>
#include <vector> class XorPuzzle {
public:
std::vector<int> find(int k, const std::vector<int> a) {
int n = static_cast<int>(a.size());
int m = 1 << k;
if (n == m) {
int s = 0;
for (int x : a) {
s ^= x;
}
if (s != 0) {
return {-1};
}
}
std::vector<int> b(m);
std::vector<int> c(m);
for (int i = 0; i < m; ++i) {
b[i] = c[i] = i;
}
for (int i = 0; i < n; ++i) {
if (a[i] == (b[i] ^ c[i])) {
continue;
}
int j = i;
while (j <= i) {
if (j == i) {
std::random_shuffle(b.begin() + j, b.end());
}
int p = 0;
while (c[p] != (a[j] ^ b[j])) {
++p;
}
std::swap(c[p], c[j]);
if (p >= i) {
break;
} else {
int t = 0;
while (b[t] != (a[p] ^ c[p])) {
++t;
}
std::swap(b[t], b[p]);
j = t;
}
}
}
std::vector<int> result(n * 2);
std::copy(b.begin(), b.begin() + n, result.begin());
std::copy(c.begin(), c.begin() + n, result.begin() + n);
return result;
}
};

topcoder srm 686 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. 海量交通大数据应用平台MTDAP_nchang的经验记录

    WRONGTYPE Operation against a key holding the wrong kind of value 根本的就是redis同一个key的value值前后类型不一致,比如最 ...

  2. Mac虚拟机上使用Genumotion模拟器

    在Mac虚拟机系统上开发ReactNative的IOS应用非常方便,只要安装Xcode即可,  但 Android应用就需要三个步骤: 首先声明,下载Android SDK会非常慢,最好有快速的网络或 ...

  3. 常见web错误码

    404表示文件或资源未找到 java WEB常见的错误代码 .1xx-信息提示:这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. -继续. -切换协议. .2xx ...

  4. Android -- 仿淘宝广告条滚动

    1,在赶项目的时候我们经常会实现下面这个功能,及添加滚动条广告广播,先看一下淘宝的效果 2,这次实现效果主要使用Android自带的ViewFlipper控件,先来看一下我们的它的基本属性和基本方法吧 ...

  5. PLSQL oracle32位 oracle64 安装区别及注意问题

    一.先明确几个概念: 1.PLSQL 只有32位的. 2.oracle 客户端 分别有32.64位,一般使用32位. 3.oracle 服务端 分别有32.64位,一般老的服务器使用32位,新的服务器 ...

  6. 《大话设计模式》c++实现 之工厂模式

    工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端 ...

  7. Rpgmakermv(34) Mog_Event Sensor

    原文: =============================================================================+++ MOG - Event Sen ...

  8. Vue系列之 => 自定义全局指定让文本框自动获取焦点

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. python 创建二维数组的方法

    废话不多说,直接上代码: #coding=utf-8 def two_di_demo1(): a=[] for i in range(10): a.append([]) for j in range( ...

  10. 开源数据流管道-Luigi vs Azkaban vs Oozie vs Airflow

    原文链接:https://www.jianshu.com/p/4ae1faea733b 随着企业的发展,他们的工作流程变得更加复杂,越来越多的有着错综复杂依赖关系的工作流需要增加监控,故障排除.如果没 ...