[AtCoder AGC002 F][DP]Leftmost Ball
来源:互联网 发布:宋为什么灭大理知乎 编辑:程序博客网 时间:2024/06/05 15:10
观察发现每个白球后面至少有一种颜色出现k-1次(就是只出现在这个白球后面),知道这个性质后可以从后往前DP
把每次放一种颜色的球分成两次,一次放k-1个这种颜色的球,一次放1个白球,这样需要放2*n次
可以省去i这一维。
放一个白球
放一种颜色
组合数预处理一下,就可以n^2了
#include <cstdio>#include <iostream>#include <algorithm>#define N 2010#define M 4000000#define P 1000000007using namespace std;typedef long long ll;int n,k;ll f[N][N],fac[N*N],inv[N*N];inline int C(int x,int y){ if(x<y) return 0; return fac[x]*inv[y]%P*inv[x-y]%P;}int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d%d",&n,&k); if(k==1) return puts("1"),0; fac[0]=inv[0]=inv[1]=1; for(int i=1;i<=M;i++) fac[i]=fac[i-1]*i%P; for(int i=2;i<=M;i++) inv[i]=(P-P/i)*inv[P%i]%P; for(int i=1;i<=M;i++) inv[i]=inv[i]*inv[i-1]%P; f[0][0]=1; for(int i=1;i<=n;i++) for(int j=i;~j;j--){ f[i][j]=f[i][j+1]%P; if(j) (f[i][j]+=f[i-1][j-1]*C(i*k-j-1,k-2))%=P; } printf("%lld\n",f[n][0]*fac[n]%P); return 0;}
0 0
- [AtCoder AGC002 F][DP]Leftmost Ball
- 【AGC002F】Leftmost Ball DP 数学
- [博弈]Atcoder AGC002 E. Candy Piles
- [agc002f]Leftmost Ball
- [整体二分 并查集]Atcoder AGC002 D. Stamp Rally
- AtCoder Regular Contest 085 F NRE 线段树优化dp
- Atcoder Regular contest 085F NRE 线段树+DP
- Atcoder ARC 077 F
- Atcoder Grand Contest 011F
- AtCoder Regular Contest 071 F
- Atcoder Grand Contest 014F
- Atcoder Grand Contest 016F
- AtCoder Regular Contest 076 F
- AtCoder Grand Contest 018 F
- AtCoder 079F Namori Grundy
- AtCoder Grand Contest 019 F
- AtCoder Grand Contest 010 F
- AtCoder Regular Contest 069 F
- Okhttp源码简单解析(一)
- Eclipse和Android Studio切换包名的方法
- Kafka 内幕:源代码High level分析 (推荐)
- ZYNQ初学者——PL部分编程实录——简单LED——连载01
- 直接打Jar包几种方式
- [AtCoder AGC002 F][DP]Leftmost Ball
- JAVA虚拟机基本概念
- 随手记录--Spring 基础与容器(1)
- 8天学通MongoDB——第一天 基础入门
- 【bzoj2818】Gcd
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- JAVA——finally块中的代码什么时候被执行、执行的效果是什么?
- java时间
- HashMap实现原理分析