首页 > 其他分享 >240906 说不上爱别说谎

240906 说不上爱别说谎

时间:2024-09-26 11:35:38浏览次数:1  
标签:std cout int long times 说谎 240906 爱别 mod

盒盒盒。这歌居然是 16 年的,都过了七八年了,突然感觉自己好老(?)

感觉自己最近说话越来越像什么,cache 命中率极低且错位。我吹过你吹过的晚风~

cache 怎么念。ca - 卡,che - 车,卡车。


A. Leftmost Ball

https://atcoder.jp/contests/agc002/tasks/agc002_f

这玩意儿不难想到,相当于是给你 \(n\) 个白球和 \(n\) 种其他颜色的球,每种 \(k-1\) 个;要求对于任意前缀,白球个数 \(\ge\) 其他颜色总数的方案数。

然后就愣住了。不知道这玩意儿怎么 DP。怒贺题解之后发现新大陆。

设 \(f_{i, j}\) 表示目前选了 \(i\) 个白球,选了 \(j\) 种其它颜色的方案数。那么肯定有 \(i\ge j\)。然后注意到状态里面是不包含位置要素的,这是因为加上了位置反而需要额外记录每种颜色选了多少个,得不偿失;不加位置状态也能转移。只需要关注还没选的 \(n-i-j\times (k-1)\) 个位置就行了。注意这些空位之间是有相对顺序的,总之挺符合直觉。

那么转移就是放白球(在最前面),和放另一个新颜色(要求第一个在最前面)。显然有:

\[f_{i+1,j}\gets f_{i+1,j}+f_{i,j},\\ f_{i, j+1}\gets f_{i, j+1}+f_{i,j}\times C_{n-j}^1\times C_{n\times k-i-j\times(k-1)-1}^{(k-1)-1}. \]

二者均须保证选掉第一个空位是为了保证不重不漏。

初始化 \(f_{0,0}=1\),答案即为 \(f_{n,n}\)。注意 \(k=1\) 要判一下。

#include <bits/stdc++.h>
const int mod = 1e9 + 7;
int main() {
#ifdef ONLINE_JUDGE
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
#else
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
#endif
	int n, k;
	std::cin >> n >> k;
	if (k == 1) {
		std::cout << 1 << '\n';
		return 0;
	}
	std::vector<std::vector<long long> > f(n + 1, std::vector<long long> (n + 1));
	std::vector<long long> fac(n * k + 1), inv(n * k + 1);
	fac[0] = inv[0] = 1;
	auto qkp = [](long long x, int y) {
		long long res = 1;
		for (; y; (x *= x) %= mod, y >>= 1)
			if (y & 1)
				(res *= x) %= mod;
		return res;
	};
	fac[0] = inv[0] = 1ll;
	for (int i = 1; i <= n * k; ++i) {
		fac[i] = fac[i - 1] * i % mod;
		inv[i] = qkp(fac[i], mod - 2);
	}
	auto C = [&](int n, int m) {
		return fac[n] * inv[n - m] % mod * inv[m] % mod;
	};
	f[0][0] = 1;
	for (int i = 0; i <= n; ++i)
		for (int j = 0; j <= n; ++j) {
			if (i + 1 <= n)
				(f[i + 1][j] += f[i][j]) %= mod;
			if (j + 1 <= n && i >= j + 1)
				(f[i][j + 1] += f[i][j] * (n - j) % mod * C(n * k - i - j * (k - 1) - 1, k - 2) % mod) %= mod;
		}
	std::cout << f[n][n] << '\n';
	return 0;
}

B. Trzy kule

https://loj.ac/p/3223

标签:std,cout,int,long,times,说谎,240906,爱别,mod
From: https://www.cnblogs.com/XSC062/p/18433048

相关文章

  • 20240906
    NewDimensions我们假设枚举\(a,b\)那么我们显然可以发现\(a^2+b^2+c^2-ab-ab-bc\)中\(c\)越大越好#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=5e3+5;intn,v[N],ans;signedmain(){cin>>n;for......
  • 20240906 模拟赛总结
    期望:100+70+4=174实际:100+70+4=174T1梦熊13连测的原题,刚好前几天订正过。。也就给我狗运到了,,观察性质发现,如果两个点所在直线与坐标轴的夹角越接近\(45^{\circ}\)就越优,转化为找到横坐标差的绝对值和纵坐标差的绝对值的差的最小值的两个点,可以坐标轴旋转,不过可以用更方便......
  • 20240906_150054 python 内容对齐方式 format
    format左右中对齐让数据左对齐"{:!<30}".format(数据)让数据右对齐"{:!>30}".format(数据)让数据居中对齐"{:!^30}".format(数据)......
  • 20240906_150844 python 槽的进制转换
    十进制转二进制b是bit的意思比特十进制转八进制十进制转16进制记忆b,二进制o,八进制x,十六进制......
  • 20240906_142605 下午的课
    20240906_142624python异常捕获try...catch...finally..._鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1193789520240906_144853python应用题工作统计_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1193802720240828_1......
  • 20240906_144853 python 应用题 工作统计
    ......
  • 20240906_142048 c语言 认识c语言
    C语言是一种广泛使用的编程语言,它以其高效、灵活和接近硬件的特性而闻名。对于零基础的学生来说,学习C语言是一个很好的起点,因为它不仅能帮助你理解计算机程序的基本结构和概念,还能为学习更高级的编程语言(如C++、Java、Python等)打下坚实的基础。下面我将简要介绍C语言的一些基本概念......
  • OpenAI 或将推出多模态人工智能数字助理;研究发现部分 AI 系统已学会「说谎」丨 RTE 开
      这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留言......
  • python学习----谁在说谎逻辑运算
    if__name__=='__main__':Li=[0,1]forainLi:forbinLi:forcinLi:zhang=(b==0)li=(c==0)wang=(a+b==0)if(zhang+li+wang==2anda+b+c=......
  • 离散数学:“张三李四王五说谎问题”
    在大一下期的离散课程里,通过王建芳教授的指导,使我真正了解并体会到了离散的数学之美。下面开始进行问题与解答的分享:谁在说谎?①张三说李四在说谎。②李四说王五在说谎。③王五说张三、李四都在说谎。请问三人中到底谁在说谎?这是通过真值表的方法来判断到底是谁在说谎,但......