AGC002F - Leftmost Ball

Solution

设fi,jf_{i,j}fi,j​表示放iii个白球,确定了jjj个颜色的球的位置的方案数。

有两种转移:

  1. 放白球,fi,j−>fi+1,jf_{i,j}->f_{i+1,j}fi,j​−>fi+1,j​
  2. 放完一种颜色的球,fi,j−>fi,j+1f_{i,j}->f_{i,j+1}fi,j​−>fi,j+1​,方案数为(n−j)∗(nk−i−j∗(k−1)−1k−2)(n-j)*\binom{nk-i-j*(k-1)-1}{k-2}(n−j)∗(k−2nk−i−j∗(k−1)−1​)。

相当于当前情况下,没选过的第一个必选以保证方案不重复。

时间复杂度O(n2)O(n^2)O(n2)。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const int MAXN=2005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int fac[MAXN*MAXN],inv[MAXN*MAXN],f[MAXN][MAXN];
int upd(int x,int y) { return x+y>=mods?x+y-mods:x+y; }
int C(int x,int y) { return 1ll*fac[x]*inv[y]%mods*inv[x-y]%mods; }
int quick_pow(int x,int y)
{int ret=1;for (;y;y>>=1){if (y&1) ret=1ll*ret*x%mods;x=1ll*x*x%mods;}return ret;
}
void Init(int n)
{fac[0]=1;for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mods;inv[n]=quick_pow(fac[n],mods-2);for (int i=n-1;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mods;
}
signed main()
{int n=read(),k=read();if (k==1) { puts("1"); return 0; }Init(n*k),f[0][0]=1;for (int i=0;i<=n;i++) for (int j=0;j<=i;j++){if (i<n) f[i+1][j]=upd(f[i+1][j],f[i][j]);if (j<i) f[i][j+1]=upd(f[i][j+1],1ll*f[i][j]*(n-j)%mods*C(n*k-j*(k-1)-i-1,k-2)%mods);}
//  for (int i=0;i<=n;i++)
//      for (int j=0;j<=n;j++) cout<<i<<" "<<j<<":"<<f[i][j]<<endl;printf("%d\n",f[n][n]);return 0;
}

AGC002F - Leftmost Ball(dp,组合计数)相关推荐

  1. AtCoder AGC002F Leftmost Ball (DP、组合计数)

    题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...

  2. AtCoder 2000 [AGC002F] Leftmost Ball(dp+组合数)

    problem 洛谷链接 solution 显然,合法序列的状态要求任何一个前缀的白色球数≥\ge≥已出现的不同颜色数. 所以可以将球分成白色球和有颜色球两类球分开放. 其次,有颜色球一类重要的是有颜 ...

  3. Sit sit sit HDU - 5151 (区间dp +组合计数)

    这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题. 首先应用根据小区间推出大区间的思路,我们可以先固定一 ...

  4. CF1237F Balanced Domino Placements(dp+组合计数)

    CF1237F Balanced Domino Placements problem solution code problem 题目链接 solution 骨牌横着放会占用一行两列,骨牌竖着放会占用 ...

  5. 【agc002f】Leftmost Ball(动态规划)

    [agc002f]Leftmost Ball(动态规划) 题面 atcoder 洛谷 题解 我们从前往后依次把每个颜色按顺序来放,那么如果当前放的是某种颜色的第一个球,那么放的就会变成\(0\)号颜色 ...

  6. CF1237F Balanced Domino Placements(组合计数,dp)

    CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌.但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响. 然而 ...

  7. 数学知识——组合计数

    组合计数 文章目录 组合计数 概述 动态规划 牡牛和牝牛 思路 代码 隔板法 方程的解 思路 代码 序列统计 思路 代码 加法 & 乘法原理 加法原理 乘法原理 车的摆放 思路 代码 容斥原理 ...

  8. 解题报告(五)组合计数(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 解题报告(二)E、(BZOJ3513) [MUTC2013] idiots(生成函数 + FFT + 组合计数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
  2. tcp-ip协议详解二知识进阶
  3. tinyhttpd-0.1.0_hacking
  4. Android 实训日志:基于外部存储的音乐播放器V03
  5. python实现程序重启_如何让python程序重新启动到某一行?
  6. 能玩java游戏oppo按键手机_游戏手机排行榜|OPPO Reno果然不负期待
  7. Hulu CEO预计网站本年营收将达5亿美元
  8. 每日一笑 | 我写了一段代码,为什么不能运行呢?
  9. OnSen UI结合AngularJs打造”美团APP我的”页面 --Hybrid App
  10. Python——正则表达式特殊符号及用法
  11. php程序员试卷无答案,2019年最新PHP经典面试题及答案,PHP程序员必看
  12. IP反向解析查询的方法
  13. python批量下载pdf
  14. 计算机辅助设计课程设计评分标准,CAD考试规则评分标准.doc
  15. C++ | (struct)结构体变量作为函数参数调用的方法小结
  16. 7-85 根据输入的空气污染指数,输出相应的信息。
  17. 因忘记一个约会而写的致歉函
  18. 2017年武昌工学院计算机基础,武昌理工学院2017.doc
  19. 2019年最值得学习的编程语言TOP5
  20. 使用阿里云邮箱发送邮件

热门文章

  1. java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)
  2. 实验 2 关键字驱动测试(2 学时)实验报告--软件功能测试与性能测试实验
  3. 数学是理工基础,如何才能令人信服?
  4. 保持学习,从这几个公众号开始!
  5. python pp模块_Python模块--Pexpect
  6. mysql序列increment_MySQL 序列 AUTO_INCREMENT
  7. function里面可以写function吗_氨基酸可以和蜂蜜一起喝吗?蜂蜜里面有氨基酸吗?...
  8. java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园
  9. java proguard 使用_一步步教你使用Proguard混淆Java源代码
  10. 地图统计_连吃七八个都不够!太仓不完整包子统计地图来了!