首页 > 其他分享 >[COCI2019-2020#5] Zapina

[COCI2019-2020#5] Zapina

时间:2024-09-10 21:16:17浏览次数:1  
标签:开心 COCI2019 int res 2020 solve Zapina dp mod

[COCI2019-2020#5] Zapina

题意

有 \(n\) 个不同的人和 \(n\) 道不同的题。

第 \(i\) 个人开心当且仅当他被分配到 \(i\) 道题。

求让至少一个人开心的分配方案数。、

思路1

定义 \(dp_{i,j}\) 表示前 \(i\) 个人发 \(j\) 道题,没人开心的方案数。

答案等于 \(n^n-dp_{n,n}\)。

\[dp_{i,j}=\sum dp_{i-1,k}\times C_{n-k}^{j-k} (j-k\ne i) \]

即枚举现在的题数,上次的题数,相减不等于 \(i\) 即可转移,乘上组合数。

代码1

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 350 + 5;
const int mod = 1e9 + 7;
int c[N][N], n;
int dp[N][N];
int qpow(int a, int b) {
	int res = 1;
	for (; b; b >>= 1, a = a * a % mod) 
		if (b & 1) res = res * a % mod;
	return res;
}
void solve() {
	cin >> n;
	for (int i = 0; i <= n; i ++) c[i][0] = 1;
	for (int i = 1; i <= n; i ++) 
		for (int j = 1; j <= i; j ++) 
			c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
	dp[0][0] = 1;
	for (int i = 1; i <= n; i ++) {
		for (int j = 0; j <= n; j ++) {
			for (int k = 0; k <= j; k ++) {
				if (j - k != i) dp[i][j] += dp[i - 1][k] * c[n - k][j - k];
				dp[i][j] %= mod;
			}
		}
	}
	cout << (qpow(n, n) - dp[n][n] + mod) % mod << "\n";
} 
signed main() {
	int Case = 1;
//	cin >> Case;
	while (Case --)
		solve();
	return 0;
}

思路2

定义 \(dp_{i,j}\) 表示前 \(i\) 个人发 \(j\) 道题,至少有一个人开心。

  1. 让 \(i\) 开心。\(dp_{i,j}=C_{j}^{i}\times(i-1)^{j-i}\)。选 \(i\) 道给 \(i\),剩下的随便放,每道题有 \((i-1)\) 种情况,有 \((j-i)\) 道题, 所以是 \((i-1)^{j-i}\)。
  2. 让 \(i\) 不开心。\(dp_{i,j}=\sum dp_{i-1,j-k}\times C_{j}^{k}(k \ne i)\)(其实和思路1等价)。

代码2

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 350 + 5;
const int mod = 1e9 + 7;
int c[N][N], n;
int dp[N][N];
int qpow(int a, int b) {
	int res = 1;
	for (; b; b >>= 1, a = a * a % mod) 
		if (b & 1) res = res * a % mod;
	return res;
}
void solve() {
	cin >> n;
	for (int i = 0; i <= n; i ++) c[i][0] = 1;
	for (int i = 1; i <= n; i ++) 
		for (int j = 1; j <= i; j ++) 
			c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
	for (int i = 1; i <= n; i ++) {
		for (int j = 0; j <= n; j ++) {
			if (j >= i) dp[i][j] += c[j][i] * qpow(i - 1, j - i) % mod;
			for (int k = 0; k <= j; k ++) {
				if (i != k) dp[i][j] += dp[i - 1][j - k] * c[j][k] % mod;
			}
			dp[i][j] %= mod;
		}
	}
	cout << dp[n][n] << "\n";
} 
signed main() {
	int Case = 1;
//	cin >> Case;
	while (Case --)
		solve();
	return 0;
}

标签:开心,COCI2019,int,res,2020,solve,Zapina,dp,mod
From: https://www.cnblogs.com/maniubi/p/18407220

相关文章

  • [COCI2020-2021#4] Vepar
    [COCI2020-2021#4]Vepar题意给定两组正整数\(a,a+1,\ldots,b\)和\(c,c+1,\ldots,d\)。判断\(c\times(c+1)\times\ldots\timesd\)能否被\(a\times(a+1)\times\ldots\timesb\)整除。思路将\(c\times(c+1)\times\ldots\timesd\)转化为\(\frac{d!}{(c-1)!}......
  • [COCI2020-2021#3] Vlak
    [COCI2020-2021#3]Vlak题意Nina和Emilija在玩游戏。Nina先手,两人轮流在纸上写下一个字母。每个玩家写下字母后得到的单词必须是该玩家喜欢的歌曲中某个单词的前缀。不能操作的玩家输,判断最后谁会赢。思路对每个玩家喜欢的歌曲建立字典树。搜索每个玩家的操作,每次在两......
  • [COCI2020-2021#5] Po
    [COCI2020-2021#5]Po题意给出一个序列\(a\),有一个序列\(b\),初始全为\(0\)。可以对序列\(b\)进行如下操作:使一个连续的区间内的所有数加上一个正整数\(x\)。但要求任意两个操作区间要么互不相交,要么一个包含另外一个。求将序列\(b\)变为序列\(a\)的最小操作次数。......
  • 关于我2020年7月至今(2024.9)的“炒股”经历和感受
    声明:我远不是一个成熟的投资者(这个名词太大了,我那三瓜两枣似乎完全配不上投资者这三个字,或者“小小散”更加贴切)。本文不构成任何入(股)市的引导或者买卖股票的建议。  “炒股”这个词,相信绝大多数人看来都-是一个贬义词,它背后似乎有:“赌博”、“亏钱”、“频繁的买卖(......
  • Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解
    题目大意输入三个整数\(a\),\(b\),\(c\),如果\(\sqrta+\sqrtb<\sqrtc\)成立,输出Yes,否则输出No。样例输入#1239输出#1No\(\sqrt2+\sqrt3<\sqrt9\)不成立。输入#22310输出#2Yes\(\sqrt2+\sqrt3<\sqrt10\)成立。分析错误思路首先,由......
  • ae软件_ae软件下载_完整版下载-AE模板 - AE2020软件包下载
    ae软件_ae软件下载_完整版下载-AE模板 - AE2020软件包下载...AE软件:从下载到精通的完全指南AdobeAfterEffects(简称AE)是一款功能强大的动态图形和视觉效果软件,广泛应用于电影、电视、广告等领域。无论你是初学者还是专业人士,掌握AE都能为你的创意作品增添无限可能。本文将为你详......
  • [网鼎杯 2020 朱雀组]phpweb
    仔细地话可以看到这题每个一段时间就会刷新一次页面,而且后面还会有一个时间,就很可疑,抓个包试试果然多了几个参数func=date&p=Y-m-d+h%3Ai%3As+a经过搜索发现这是一个函数(用来显示时间,也就证实了前面地图片为什么会出现时间地原因)于是试着就修改函数和参数来执行命令但是最......
  • P8139 [ICPC2020 WF] Sweep Stakes 题解
    思路容易发现,题目要求我们动态维护这样一个多项式。\[\prod_{i}(1-p_i+p_ix)\]如何维护。由于精度问题,我们很难去进行一个多项式除法将其暴力求出。考虑\(p_i\le0.2\)。可以得知,我们的多项式的数的增减是比较大的。那么在一定数量后,一些可能有值的系数在当前精度下是可以......
  • 【春秋云境】CVE-2020-26048(文件上传漏洞)
    点击路径,进入页面,尝试攻克。admin/admin弱口令成功登录寻找能进行文件上传的地方,点击“文件管理”尝试上传php后缀的一句话木马文件,发现失败上传png后缀的一句话木马文件,发现成功对文件重命名前打开bp,进行抓包,修改后缀名删除.htaccess文件(该文件具有重定向URL、......
  • LG P9108 [PA2020] Malowanie płotu
    状态数是\(O(nm^2)\)的DP很好想,就是\(dp_{i,l,r}\)表示第\(i\)次的区间为\([l,r]\)的方案数。但是这个状态数就已经死了,而题目又提示\(n\timesm\leq1e7\),说明状态只能形如\(dp_{i,j}\)。这时就会想到一个简陋的打补丁方式:设\(f_{i,l},g_{i,r}\)分别表示第\(i\)......