博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AT2000 Leftmost Ball 解题报告
阅读量:5304 次
发布时间:2019-06-14

本文共 1257 字,大约阅读时间需要 4 分钟。

题面

给你n种颜色的球,每个球有k个,把这n*k个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多少种不同的颜色序列,答案对1e9+7取模

解法

\(f(i,\;j)\)表示在这些\((n \times k个)\)位置上已经放了i个白球,j种其他颜色的球。(i<j)

\(f(i,\;j) = f(i-1,\; j)+f(i ,\;j-1)\times (n-j+1)\times \dbinom{k-2}{n*k-i-(j-1)*(k-1)-1}\)

第一部分: 加一个白球,我们规定了白球放首位以避免重复计算

第二部分: 加入一种新颜色: 还有(n-j+1)种颜色,选出一种后,需要放(k-2)个,又因为共有i+(j-1)*(k-1)-1个空格,所以是\(f(i ,\;j-1)\times (n-j+1)\times \dbinom{k-2}{n*k-i-(j-1)*(k-1)-1}\)

证毕!

代码

#include
using namespace std ;#define int unsigned long longconst int mxn = 8000005 ;const int Mod = 1e9+7 ;int frac[mxn], inv[mxn];int f[2005][2005], n, k;int power(int a, int b){ int res=1, car=a; while(b){ if(b&1) (res*=car)%=Mod; (car*=car)%=Mod; b>>=1; } return res;}void init(){ frac[0]=1 ; for(int i=1;i
0;--i) inv[i]=(inv[i+1]*(i+1))%Mod ; inv[0] = 1 ;}int C(int n, int k){ return ((frac[n]*inv[k]%Mod)*inv[n-k])%Mod ;}signed main(){ init() ; cin>>n>>k; if(k==1) return puts("1"),0 ; f[0][0] = 1 ; for(int i=1;i<=n;++i) for(int j=0;j<=i;++j) (f[i][j] = f[i-1][j]+(j?((((f[i][j-1]*(n-j+1))%Mod)*C(n*k-i-(j-1)*(k-1)-1, k-2))%Mod):(0)))%=Mod ; cout<
<

转载于:https://www.cnblogs.com/tyqtyq/p/11378987.html

你可能感兴趣的文章
yum 命令跳过特定(指定)软件包升级方法
查看>>
创新课程管理系统数据库设计心得
查看>>
Hallo wolrd!
查看>>
16下学期进度条2
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
Chapter 3 Phenomenon——12
查看>>
C语言中求最大最小值的库函数
查看>>
和小哥哥一起刷洛谷(1)
查看>>
jquery对id中含有特殊字符的转义处理
查看>>
遇麻烦,Win7+Ubuntu12.10+Archlinux12.10 +grub
查看>>
SqlBulkCopy大批量导入数据
查看>>
pandas 修改指定列中所有内容
查看>>
「 Luogu P2285 」打鼹鼠
查看>>
lua语言入门之Sublime Text设置lua的Build System
查看>>
vue.js基础
查看>>
电脑的自带图标的显示
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
C++ 删除字符串的两种实现方式
查看>>
ORA-01502: 索引'P_ABCD.PK_WEB_BASE'或这类索引的分区处于不可用状态
查看>>
Java抽象类和接口的比较
查看>>