CodeForces 568B DP Symmetric and Transitive
题意:
根据离散数学的内容知道,一个二元关系是一个二元有序组<x, y>的集合。
然后有一些特殊的二元关系,比如等价关系,满足三个条件:
- 自反性,任意的x,都有二元关系<x, x>
- 对称性,如果有<x, y>则有<y, x>
- 传递性,如果有<x, y>和<y, z>,则有<x, z>
现在要统计满足后两条,但不满足第一个条件的二元关系的个数。
题中的证明是对的:
If , then
(according to property (2)), which means
(according to property (3)).
但是前提条件不一定存在,比如对于a,没有一个b满足那么后面的推导就无从谈起了。
不妨把这些不和其他元素(包括自己)产生二元关系的元素称作「空」的。
只要至少有一个「空」的元素,而且其他的元素都在某个等价类里面,就满足题目中的要求。
枚举非「空」元素的个数k(1 ≤ k ≤ n),选出k个元素有C(n, k)中方案,再乘上将k个元素划分为若干个等价类的方案数eq[k],累加起来就是答案。
eq数组可以这样计算:
设d(i, j)为将i个元素划分为j个不同等价类的方案数,d(i, j) = d(i-1, j) * j + d(i-1, j-1) //考虑第i个数加入已有的j个等价类,或者自己成为一个新的等价类
那么eq[i] = sum{ d(i, j) | 0 ≤ j ≤ i }
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long LL; const int maxn = + ;
const LL MOD = ; LL C[maxn][maxn], d[maxn][maxn]; void add(LL& x, LL y)
{
x += y;
if(x >= MOD) x -= MOD;
} int main()
{
int n; scanf("%d", &n); for(int i = ; i <= n; i++) C[i][] = C[i][i] = ;
for(int i = ; i <= n; i++)
for(int j = ; j < i; j++) C[i][j] = (C[i-][j] + C[i-][j-]) % MOD; d[][] = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= i; j++) d[i][j] = (d[i-][j] * j + d[i-][j-]) % MOD; LL ans = ;
for(int i = ; i < n; i++)
{
LL eq = ;
for(int j = ; j <= i; j++) add(eq, d[i][j]);
ans = (ans + C[n][i] * eq) % MOD;
} printf("%I64d\n", ans); return ;
}
代码君
CodeForces 568B DP Symmetric and Transitive的更多相关文章
- codeforces 569D D. Symmetric and Transitive(bell数+dp)
题目链接: D. Symmetric and Transitive time limit per test 1.5 seconds memory limit per test 256 megabyte ...
- Codeforces 568B Symmetric and Transitive
http://codeforces.com/contest/568/problem/B 题意:题意还挺绕的,其实就是说:要你求出一个图,要求保证其中有至少一个点不连任何边,然后其他连边的点构成的每个联 ...
- Two Melodies CodeForces - 813D (DP,技巧)
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...
- Consecutive Subsequence CodeForces - 977F(dp)
Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
- Codeforces 721C [dp][拓扑排序]
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...
- CodeForces 607C (DP) Hard problem
题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...
- Codeforces 611d [DP][字符串]
/* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候 ...
- Codeforces 404D [DP]
/* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...
随机推荐
- c# 串口操作
public class CommPort : IDisposable { public string Port = ""; ///<summary> ///波特率96 ...
- c#基础 里氏转换
1.里氏转换1).子类可以赋值给父类2).如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象. 2.子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员. //// 1.里氏转换 ...
- @ConfigurationProperties
功能 将属性文件与一个Java类绑定,属性文件中的变量与Java类中的成员变量一一对应,无需完全一致. 如需将 @ConfigurationProperties 注解的目标类添加到Spring IOC ...
- springboot 学习笔记(二)
springboot 学习笔记(二) 快速创建一个springboot工程,并引入所需要的依赖 1.利用Spring initializr 来创建一个springboot项目,登陆http://sta ...
- Android ORM对象关系映射之GreenDAO建立多表关联
https://blog.csdn.net/u010687392/article/details/48496299 利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数 ...
- Windows环境中,通过Charles工具,抓取安卓手机、苹果手机中APP应用的http、https请求包信息
Windows环境中,通过Charles工具,抓取安卓手机.苹果手机中APP应用的http.https请求包信息1.抓取安卓手机中APP应用的http请求包信息1)在电脑上操作,查看Windows机器 ...
- Protocol Buffer学习教程之编译器与类文件(三)
Protocol Buffer学习教程之编译器与类文件(三) 1. 概述 在前面两篇中,介绍了Protobuf的基本概念.应用场景.与protobuf的语法等.在此篇中将介绍如何自己编译protobu ...
- [VC]listctrl的基本用法
1 添加listctrl的头 m_list.setextendedstyle(LVS_EX_FULLROWSELECT||LVS_EX_GRIdLINES); m_list.insertcolum ...
- UVA 11627 Slalom(二分)
二分,判断的时候,一个点一个点的考虑肯定是不行啦,考虑的单位是一个区间, 每次左端点尽量向左边移动,右端点尽量向右,得到下次可以达到的范围,检查一下和下一个区间有没有交集. #include<b ...
- [opencv] applyColorMap
applyColorMap 功能 转化为热力图,因为热力图我们看的变化更加细微,在很多地方都用到了热力图. 最近在看CAM,所以记一记这个函数. 感觉还是很有用的. 代码 >>> i ...