牛客网多校训练第一场 B - Symmetric Matrix(dp)
链接:
https://www.nowcoder.com/acm/contest/139/B
题意:
求满足以下条件的n*n矩阵A的数量模m:
A(i,j) ∈ {0,1,2}, 1≤i,j≤n.
A(i,j) = A(j,i), 1≤i,j≤n.
A(i,1) + A(i,2) + ... + A(i,n) = 2, 1≤i≤n.
A(1,1) = A(2,2) = ... = A(n,n) = 0.
其中1≤n≤1e5, 1≤m≤1e9。
分析:
把矩阵看成无向图的邻接矩阵,即要求所有点度为2,即每个点都属于一个环。
设d(n)表示n个点满足条件的图的数量。
思考每加入一个新点,如何从已知状态转移。
1.从前面的n-1个点中选出1个点与新点构成环,有(n-1)d(n-2)种方案。
2.从前面的n-1个点中选出k个点,剩下的点与新点连成环,
有sum(C(n-1,k)*(n-1-k)!/2)(2≤k≤n-3)种方案,
因为剩下的点与新点连成环时的对称性,所以要除以2。
将以上两式化简相加,得d(n) = (n-1)d(n-2) + sum((n-1)!d(k)/k!/2)(2≤k≤n-3)。
设f(n) = sum((n-1)!d(k)/k!/2)(2≤k≤n-3)。
可以发现,f(n)也是可以递推的,即f(n) = (n-1)f(n-1) + (n-1)(n-2)d(n-3)/2。
所以,线性时间递推f和d数组即可。
代码:
import java.io.*;
import java.util.*; public class Main {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
final int UP = (int)1e5 + 5;
long d[] = new long[UP], f[] = new long[UP]; void MAIN() {
while(cin.hasNext()) {
int n = cin.nextInt();
long m = cin.nextInt(); d[2] = d[3] = f[3] = 1 % m;
for(int i = 4; i <= n; i++) {
f[i] = ((i-1) * f[i-1] % m + (long)(i-1) * (i-2) / 2 % m * d[i-3] % m) % m;
d[i] = ((i-1) * d[i-2] % m + f[i]) % m;
}
System.out.println(d[n]);
}
} public static void main(String args[]) { new Main().MAIN(); }
}
牛客网多校训练第一场 B - Symmetric Matrix(dp)的更多相关文章
- 牛客网多校训练第一场 A - Monotonic Matrix(Lindström–Gessel–Viennot lemma)
链接: https://www.nowcoder.com/acm/contest/139/A 题意: 求满足以下条件的n*m矩阵A的数量模(1e9+7):A(i,j) ∈ {0,1,2}, 1≤i≤n ...
- 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...
- 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)
链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...
- 牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)
链接: https://www.nowcoder.com/acm/contest/139/F 题意: 分析: 转载自:http://tokitsukaze.live/2018/07/19/2018ni ...
- 牛客网多校训练第一场 E - Removal(线性DP + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/E 题意: 给出一个n(1≤n≤1e5)个整数(范围是1至10)的序列,求从中移除m(1≤m≤min(n-1, ...
- 牛客网多校训练第一场 D - Two Graphs
链接: https://www.nowcoder.com/acm/contest/139/D 题意: 两个无向简单图都有n(1≤n≤8)个顶点,图G1有m1条边,图G2有m2条边,问G2有多少个子图与 ...
- 牛客网多校训练第二场D Kth Minimum Clique
链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...
- 牛客网多校训练第九场H Cutting Bamboos
题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...
- 牛客网多校第3场C-shuffle card 平衡树或stl(rope)
链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...
随机推荐
- 使用Charles为Android设备抓取https请求的包
之前开发的Android APP使用的都是http请求,之后改成了https,就出现了以下情况,无法正常读取抓取的内容 找了好多资料说法大概差不多,照着弄,结果出现如下情况,后来发现这种情况其实是手机 ...
- T_SQL 语句想已有数据表添加约束
如果向存在数据的表里添加约束,有可能会出现数据不符合检查约束而造成添加约束失败. 如: USE DEmo--指向当前操作的数据库 GO ALTER TABLE Employee ADD CONSTRA ...
- .net面试题升级版
1.列举ASP.NET页面之间传值的几种方式. 答:使用QueryString,如.../id=1;response.Redirect() 使用Session 使用Server.Transfer 使用 ...
- golang学习之win7下go web之revel安装
接着上回记录的win7下go环境搭建,go的开发,现在除了sublime外,LiteIDE比较推荐,下载链接 下载安装后直接打开,需要配置下go环境(本机使用的是window 386版本),如下: 打 ...
- JS实现中英文混合文字溢出友好截取功能
在显示字符串的时候,避免字符串过长往往会对字符串进行截取操作,通常会用到js的 substr 或者 substring方法, 以及 字符串的length属性 substr() 方法可在字符串中抽取从 ...
- forward和redirect请求方式
之前一直对forward和redirect有点疑问,现在练习一下加深点记忆,理解理解,forward是一次请求,在一个request范围内,而redirect是二次请求 实例: @Controller ...
- vue-i18n国际化实例
demo 场景需求分析 需求很简单,左上角 ''网易云音乐''就是一个中英文切换的按钮,点击弹出提示框,确认切换语言后,实现英文版本. 切换成英文版本: 三.实现国际化 1.我们得先有开发环境,先有项 ...
- mysql三表联合查询
-- SELECT d.userId, d.userPhoNum, a.orderId, a.productType, b.courseId, b.courseName, c.payJe -- FRO ...
- 10分钟学会Less开发环境搭建与初体验
Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 今天看一下,10分钟能不能手把手快速教会你Le ...
- Python爬虫教程-30-Scrapy 爬虫框架介绍
从本篇开始学习 Scrapy 爬虫框架 Python爬虫教程-30-Scrapy 爬虫框架介绍 框架:框架就是对于相同的相似的部分,代码做到不出错,而我们就可以将注意力放到我们自己的部分了 常见爬虫框 ...