@Falsyta
2015-08-09T07:21:58.000000Z
字数 1549
阅读 1301
OI mxh带窝飞
对于两个字符串
对于两个字符串
窝严重怀疑ZJU的审美呀………………
出题人还不标数据组数呀w
感觉做起来并不是很开心呢。
给定一个无向图
给出非负数列
定义可以通过重新排列字符变成回文串的字符串为好串。
求字符集为
由于点的问题不容易解决,考虑将问题转化到边上。
维护一个无向图
1. 向图中插入边
2. 询问当前图是否是二分图。
然后就变成原题了。
用分治+并查集即可。
由于
对数的取值只有
时间复杂度
先介绍低端的做法。
考虑
然后枚举每种长度的子串统计贡献即可。
时间复杂度
卡常数呀w
# include <cstdio># include <algorithm>using namespace std;# define REP(i, n) for (int i = 1; i <= n; i ++)# define REP_0N(i, n) for (int i = 0; i <= n; i ++)const int NR = 2020;const int P = 1000000007;int f[NR][NR], inv[NR];int Pow (int a, int z) {int s = 1; do {if (z & 1) s = 1ll * s * a % P; a = 1ll * a * a % P;} while (z >>= 1); return s;}int pw[2010][2010];int main (){f[0][0] = 1;REP (i, 2000){pw[i][0] = 1;REP (j, 2000) pw[i][j] = 1ll * pw[i][j - 1] * i % P;}int n, m, q0;for (scanf ("%d", &q0); q0; q0 --){scanf ("%d%d", &n, &m);int ans = 0;REP (i, n){int len = min (m, i);f[i][0] = f[i - 1][1];f[i][len + 1] = f[i][len + 2] = f[i][len + 3] = 0;REP (j, len) f[i][j] = (1ll * (j + 1) * f[i - 1][j + 1] + 1ll * (m - j + 1) * f[i - 1][j - 1]) % P;}REP (i, n) ans = (ans + 1ll * (n - i + 1) * pw[m][n - i] % P * (f[i][0] + f[i][1])) % P;printf ("%d\n", ans);}return 0;}
高端做法写完再说好啦。