【题目大意】

求n*n的棋盘,每行每列都有2个黑格子的方案数。

n<=10^7

【题解】

zzq的做法好神奇啊

行列建点,二分图

左边有i个点,右边有j个点的方案数 f[i,j]

左边有i个点,2个已经有1个度,右边有j个点的方案数 g[i,j]

g[i,j] = f[i-2,j-1]*j + g[j,i-2]*P(j,2)

f[i,j] = g[i,j-1] * C(i,2) = g[j,i-1] * C(j,2)

g[j,i-2] = g[i-1,j-1] * C(i-1,2) / C(j,2)

g[i,j] = g[i-2,j-2] * C(i-2,2) * j + g[i-1, j-1] * C(i-1,2) / C(j,2) * P(j,2)

g[i,j] = g[i-2,j-2] * C(i-2,2) * j + g[i-1, j-1] * C(i-1,2) * 2

g[x] = g[x, x-1]

g[x] = g[x-2] * C(x-2, 2) * (x-1) + g[x-1] * C(x-1, 2) * 2

ans = sigma (C(x,2) * g[x])

Q: 为什么从f转移到g,只乘了右边选择的部分,不管左边;从g转移到f,只乘了左边的部分,不管右边?

A: g实际的意义是我钦定左边最后两个度数为1的方案数,f实际的意义是我钦定右边最后1或2个是我最后填进来。 我从g到f,目的是消去两个度为1的点,重点是消去,我要优先考虑消除哪两个点,按照我g的定义,每两个度数为1的点作为选择,都有这么多方案,所以要乘组合数;从f到g,目的是制造两个度为1的点,按照f的定义,每1或2个点作为选择,都有这么多方案,所以要乘j和后面的那个组合数。意义在于,我要有一个顺序来填数,不能xjb填,这样会统计重复方案,我们用钦(ying)点来避免这样的问题。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; # define RG register
# define ST static const int M = 1e7 + ;
const int mod = ; int n, g[M], ans; inline int C(int n, int k = ) {
return (ll)n * (n-) / % mod;
} int main() {
// freopen("B.in", "r", stdin);
// freopen("B.out", "w", stdout);
cin >> n;
g[] = , g[] = ;
for (int i=; i<=n; ++i) {
g[i] = 1ll * C(i-) * (i-) % mod * g[i-] % mod + 2ll * C(i-) * g[i-] % mod;
if(g[i] >= mod) g[i] -= mod;
}
for (int i=; i<=n; ++i) {
ans += 1ll * C(i) * g[i] % mod;
if(ans >= mod) ans -= mod;
}
cout << ans;
return ;
}

多贴几份考试写的各种暴力吧qwq

O(n^2)求单点暴力

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; # define RG register
# define ST static const int M = 1e4 + , N = 1e5 + ;
const int mod = ; int n, f[][M];
// row i, line2: j line1: k line0: l inline int C(int n, int k) {
if(k == ) return n;
if(k == ) return (ll)n * (n-) / % mod;
} int main() {
// freopen("B.in", "r", stdin);
// freopen("B.out", "w", stdout);
int pre = , cur = ; cin >> n;
for (int j=; j<=n; ++j) f[pre][j] = ;
f[pre][] = ;
for (int i=; i<=n; ++i) {
for (int j=; j<=i; ++j) {
f[cur][j] = ;
// i*2 = j*2 + k => k = i*2 - j*2
int k = i* - j*, l = n-j-k;
// printf("%d line2: %d line1: %d line0: %d\n", i, j, k, l);
if(l < ) continue;
if(j >= ) {
f[cur][j] += 1ll * C(k+, ) * f[pre][j-] % mod;
if(f[cur][j] >= mod) f[cur][j] -= mod;
}
if(k >= ) {
f[cur][j] += 1ll * C(l+, ) * f[pre][j] % mod;
if(f[cur][j] >= mod) f[cur][j] -= mod;
}
if(j && k) {
f[cur][j] += 1ll * C(k, ) * C(l+, ) * f[pre][j-] % mod; // 10w: need mod again
if(f[cur][j] >= mod) f[cur][j] -= mod;
}
// printf("F = %d\n", f[i][j]);
}
swap(pre, cur);
}
cout << f[pre][n] << ','; return ;
}

把含有n-...的项换成不含n的等价表示就有70分了。。

我是考试的时候打了个1w的表发现100K,压了一半,套这个做法。。50(被评测机卡)

「6月雅礼集训 2017 Day2」B的更多相关文章

  1. 「6月雅礼集训 2017 Day2」C

    [题目大意] 有一棵n个点的完全二叉树,边权均为1,每个点有小鸟容量c[i] 依次来了m只小鸟,第i只小鸟初始位置在pos[i]上,问来了x只小鸟的时候,怎样安排小鸟的路线可以使得小鸟移动的边权和最小 ...

  2. 「6月雅礼集训 2017 Day2」A

    [题目大意] 给出一棵树,求有多少对点(u,v)满足其路径上不存在两个点a,b满足(a,b)=1 n<=10^5 [题解] 考虑找出所有不符合的点对,共有n*ln(n)对,他们要么是祖先-> ...

  3. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  4. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  5. 「6月雅礼集训 2017 Day11」delight

    [题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...

  6. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  7. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  8. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  9. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

随机推荐

  1. springmvc+spring-data-jpa+hibernate环境搭建与配置

    1.JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在ORM框架中,Hibernate是一支 ...

  2. "Cannot open source file "Wire.h" " in Arduino Development

    0. Environment Windows 8 x64 Arduino 1.0.5 Visual studio 2012 Visual micro Arduino 1. Steps Add &quo ...

  3. 【好帖】 Mark

    1. 管理篇 2. 程序员选择公司的8个标准 3. 实用工具 4. 离职跳槽 5. DBA 6. 做一个网站多少钱? 7. 十大算法 8. 寻求用户评价App的正确方法 9. 工程师忽略的隐形成本 1 ...

  4. howto:在构建基于debian的docker基础镜像时,更换国内包源

    debian经常被用作构建应用镜像的基础镜像,如微软在构建linux下的dotnetcore基础镜像时,提供了基于debian 8(jessie)和debian 9(stretch)的镜像. 由于这些 ...

  5. Python全栈 MongoDB 数据库(数据的修改)

    修改操作符的使用   $set 修改一个域的值,增加一个域   阿哲年龄修改为33 db.class1.update({name:'阿哲'},{$set:{age:33}})   如果sex域不存在则 ...

  6. AGV小车典型设计算法及应用

    1. AGV小车的发展背景 在现代化工业的发展中,提倡高效,快速,可靠,提倡将人从简单的工作中解放出来.机器人逐渐替代了人出现在各个工作岗位上.机器人具有可编程.可协调作业和基于传感器控制等特点,自动 ...

  7. Fast-RCNN论文总结整理

    此篇博客写作思路是一边翻译英文原文一边总结博主在阅读过程中遇到的问题及一些思考,因为博主本人阅读英文论文水平不高,所以还请大家在看此篇博客的过程中带着批判的眼神阅读!小墨镜带好,有什么不对的地方请在留 ...

  8. BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块

    Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...

  9. LoadRunner系统架构简介与运行原理

    1.LoadRunner系统架构简介 LoadRunner是通过创建虚拟用户来代替真实实际用户来操作客户端软件比如Internet Explorer,来向IIS.Apache等Web服务器发送HTTP ...

  10. [剑指Offer] 42.和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. [思 ...