2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)
题意
给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵。问你大小为n的这样的合法矩阵有多少个。
分析
作者:美食不可负064
链接:https://www.nowcoder.com/discuss/87226?type=101&order=0&pos=1&page=1
来源:牛客网
题目给出的合法矩阵是一个类似与邻接矩阵的样式。 所以应该往这方面去考虑。
每行之和等于2 , 代表每个点都连有两条边,可以有重边 不能有自环。
这说明 每个点属于且仅属于一个环。
因为输入只有一个n
应该要往dp递推的方向上去想。
现在开始找递推式。
定义dp[n]表示n个点构成的合法图的方案数。
思考每加入一个新球,如何从已知状态转移。
考虑从前面的n-1个球中选取一些球和新球组成一个环。
特殊考虑只取一个旧球的情况,
这种情况下这个旧球有n-1种方案 剩下的n-2个球组成的合法方案数已经求出。
所以这种情况下 方案数为(n-1)f(n-2)
推广到一般情况
当我们取k个旧球,剩下的球与新球组成环时,旧球的取法有C(n-1,k) ,剩下的旧球与新球组成环的方案数有(n-1-k)!种
但是考虑对称性 需要除以2。 又考虑到只取一个球的时候不需要考虑对称性 ,所以把这种情况单独摘出来考虑。
最后得到 dp[n]的递推式就是
dp[n] = (n-1) dp[n-2] + sigma(x:2->n-3)((n-1)!/(2*x!)dp[x])
但是这个东西有一个讨厌的sigma 我们可以通过相减的方法来消除这个sigma。
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define lc idx<<1
#define rc idx<<1|1
#define rson mid+1,r,rc
#define lson l,mid,lc
using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1e9+;
int T;
void testcase(){
printf("Case %d: ",++T);
}
const int MAXN = 1e6+;
const int MAXM = ; ll dp[MAXN]; int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
ll n,m;
dp[]=;
dp[]=dp[]=;
while(cin>>n>>m){
for(ll i=;i<=n;i++){
dp[i]=((i-)*dp[i-]%m + (i-)*dp[i-]%m+m-(i-)*(i-)/%m*dp[i-]%m)%m;
}
cout<<dp[n]<<endl;
}
return ;
}
2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)的更多相关文章
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
- 2018 牛客网暑期ACM多校训练营(第一场) E Removal (DP)
Removal 链接:https://ac.nowcoder.com/acm/contest/139/E来源:牛客网 题目描述 Bobo has a sequence of integers s1, ...
- 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...
- 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
链接:https://ac.nowcoder.com/acm/contest/148/J?&headNav=acm 来源:牛客网 Rikka with Nickname 时间限制:C/C++ ...
- 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)
题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...
- 2018牛客网暑期ACM多校训练营(第三场) A - PACM Team - [四维01背包][四约束01背包]
题目链接:https://www.nowcoder.com/acm/contest/141/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]
题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]
题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- 【HDU 6036】Division Game (NTT+数学)
多校1 1004 HDU-6036 Division Game 题意 有k堆石头(0~k-1),每堆n个.\(n=\prod_{i=0}^{m}p_i^{e_i}\).\(0\le m,k \le 1 ...
- Docker 私有仓库 Harbor registry 安全认证搭建 [Https]
Harbor源码地址:https://github.com/vmware/harborHarbort特性:基于角色控制用户和仓库都是基于项目进行组织的, 而用户基于项目可以拥有不同的权限.基于镜像的复 ...
- Nifi 模板
Acqusition_and_Processing.xml Moving templates to own directory to make repo cleaner CADF_Pars ...
- 深挖JDK动态代理(二):JDK动态生成后的字节码分析
接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transCl ...
- A1116. Come on! Let's C
"Let's C" is a popular and fun programming contest hosted by the College of Computer Scien ...
- A1088. Rational Arithmetic
For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...
- (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节
背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...
- linux提取第一列且删除第一行(awk函数)
如下文件所示,只想提取红框中的内容,即进行提取第一列,且去除第一行的操作 则用到下列命令行: awk 'NR == 1 {next} {print $1}' file.txt > file_co ...
- 初始redis数据库
redis就是一个类似于存储在内存中的大字典 安装: windows下安装redis: 你需要在你的环境下安装: pip install redis 以上是在你的全局环境安装, 你如果用的是虚拟环境你 ...
- CentOS7 yum 安装 PHP 5.6.24
配置yum源 追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel- ...