【AGC002F】Leftmost Ball DP 数学
来源:互联网 发布:淘宝崔天琪同款手环 编辑:程序博客网 时间:2024/06/08 11:34
题目大意
有
题解
我们称颜色为
我们先钦定每种颜色最左边那个球的出现顺序为
考虑从后往前放,设当前序列最前面有
设
可以发现后面那个组合数和
时间复杂度:
代码
#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<ctime>#include<utility>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> pii;ll p=1000000007;ll fac[4000010];ll ifac[4000010];ll inv[4000010];void init(int n){ int i; fac[0]=fac[1]=ifac[0]=ifac[1]=inv[0]=inv[1]=1; for(i=2;i<=n;i++) { inv[i]=-(p/i)*inv[p%i]%p; fac[i]=fac[i-1]*i%p; ifac[i]=ifac[i-1]*inv[i]%p; }}ll c(int x,int y){ if(x<y) return 0; return fac[x]*ifac[y]%p*ifac[x-y]%p;}ll f[2010][2010];int main(){ int n,k; scanf("%d%d",&n,&k); if(k<=1) { printf("1\n"); return 0; } init(n*k); int i,j; f[0][0]=1; for(i=1;i<=n;i++) for(j=n;j>=0;j--) { if(j<=i) f[i][j]+=f[i-1][j-1]*c(k*i-j-1,k-2)%p; f[i][j]=(f[i][j]+f[i][j+1])%p; } ll ans=(f[n][0]%p+p)%p; ans=ans*fac[n]%p; printf("%lld\n",ans); return 0;}
阅读全文
0 0
- 【AGC002F】Leftmost Ball DP 数学
- [agc002f]Leftmost Ball
- [AtCoder AGC002 F][DP]Leftmost Ball
- HDU1060 Leftmost Digit 【数学】
- Leftmost Digit(数学)
- HDU 1060 Leftmost Digit(数学)
- 数学——Leftmost Digit
- HDU 1060:Leftmost Digit【数学】
- HDU1060 Leftmost Digit (数学推导)
- HDU 1060 Leftmost Digit(数学)
- hdu 4811 Ball(数学)
- HDU_3872 Dragon Ball dp
- 【DP】 hdu4362 Dragon Ball
- HDU4362Dragon Ball【dp优化】
- HDOJ 题目1060Leftmost Digit(数学)
- hdoj--1060--Leftmost Digit(数学)
- HDU:1060 Leftmost Digit(数学)(水)
- 数学1(n^n)Leftmost Digit
- redis持久化
- 算法练习__二叉查找树
- 剑指编程(10)
- mysql 乐观锁和悲观锁的区别,以及乐观锁实现
- 【PBOC卡片交易日志分析】流程
- 【AGC002F】Leftmost Ball DP 数学
- Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0
- python 内存释放
- shell里面的$*,$@,$#,$0,$1...$9
- 洛谷P1268 树的重量 【构造 + 枚举】
- Java位运算总结:位运算用途广泛
- 百思不得其解的WebAPI控制器匹配BUG
- python中使用 C 类型的数组以及ctypes 的用法
- android studio 中shape的使用