[AT2000] [agc002_f] Leftmost Ball

题目链接

AtCoder:https://agc002.contest.atcoder.jp/tasks/agc002_f

洛谷:https://www.luogu.org/problemnew/show/AT2000

Solution

对于一个任意的颜色序列,它合法当且仅当任意一个前缀序列都要满足白色数量大于等于颜色种类数(不包括白色)。

\(f[i][j]\)表示当前填了\(i\)个白球,\(j\)种其他颜色的球的方案数,显然当\(i<j\)\(f[i][j]=0\)

考虑转移,我们考虑每次都填最前面那个没填过的位置:

  • 填白球不会有任何影响,直接转移就好了。
  • 否则我们可以从剩下\(n-(j-1)\)种颜色种任选一种,一个填在第一个能填的位置,剩下的\(k-2\)个填在剩下\(n*k-i-(j-1)(k-1)-1\)个位置里。

转移式子就是:
\[ f[i][j]=f[i-1][j]+f[i][j-1]\cdot (n-j+1)\cdot \binom{nk-i-(j-1)(k-1)-1}{k-2} \]
暴力转移就好了,初值\(f[0][0]=1\),时间复杂度\(O(n^2)\)

#include<bits/stdc++.h>
using namespace std;

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}

void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf double
#define ll long long 

const int maxn = 2e3+10;
const int maxm = maxn*maxn;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7;

int add(int x,int y) {return x+y>mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;}

int n,k,f[maxn][maxn],fac[maxm],ifac[maxm],inv[maxm];

void prepare() {
    inv[0]=inv[1]=fac[0]=ifac[0]=f[0][0]=1;
    for(int i=2;i<maxm;i++) inv[i]=mul(mod-mod/i,inv[mod%i]);
    for(int i=1;i<maxm;i++) fac[i]=mul(fac[i-1],i);
    for(int i=1;i<maxm;i++) ifac[i]=mul(ifac[i-1],inv[i]);
}

int c(int nn,int mm) {return mul(fac[nn],mul(ifac[mm],ifac[nn-mm]));}

int main() {
    read(n),read(k);prepare();if(k==1) puts("1"),exit(0);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=i;j++)
            f[i][j]=add(f[i-1][j],mul(f[i][j-1],mul(n-j+1,c(n*k-i-(k-1)*(j-1)-1,k-2))));
    write(f[n][n]);
    return 0;
}

转载于:https://www.cnblogs.com/hbyer/p/10721756.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常好用印花分色软件!完全免费使用! AT2000说明 给您一套完整的解决方案: 电脑印花分色软件经历了一个漫长的发展过程,每一次版本的升级都是 一次质的飞跃,都将使用者带到了一个更全面的应用空间。 ATSL是矢量版电脑印花分色软件,是对各种印花图案进编辑、分色、设 计及其工艺后处理的标准程序。ATSL友好的界面、强大的功能和方便的操作 将会得到用户的青睐,是电脑分色系统的再一次突破。 系统概述 印花 CAD领域的先驱 快捷的分色描稿 真正的矢量化处理 独创的六分色功能 智能化线条描绘 轻松处理超大型图像 主要特点 扫描输入:根据不同花型选择最佳的扫描模式和分辨率,并可去除网纹;局部输入的图 象直接拼 接成大图象,并在拼接时自动调整。 幅面处理:不必担心内存太小,超大幅面的图象照样可以轻松处理。 图象校斜:校正扫描输入时图象放置的歪斜和因布纹扭曲而造成的花型的歪斜。 图象调整:通过色阶调整和曲线调整,调整图象的明亮度和对比度,改变图象质量。 线条勾画:包括各种曲线、直线、点串、毛毛虫等;压力笔的使用使线条更加随意、生 动。 撇丝描绘:多种可调整的撇丝形状、单笔撇丝和多笔撇丝的结合使用使撇丝描绘简单、 生动。 泥点丰富:可表现不同层次丰富的泥点和各种不同风格的模板泥点。 喷笔绘画:绘画表现力强,可以绘制丰富多彩的油画、水彩等风格效果。 连晒显示:在设计和修改的同时自动显示回位连晒的效果,包括水平、垂直的平接、跳接及方巾、 长巾的旋转与对称等方式。 云纹生成:自动生成平滑过渡的云纹渐变及曲线边界的云纹渐变。 去除噪点:对图象进行自动的噪点去除,在一定程度上去除因布纹引起的龟纹。 分色处理:可对图象进行选色分色,保持复色云纹的叠色效果;六分色功能可以还原几乎所有的 原稿的风格,且分色简单易用。 挂网预示:对云纹花型预示挂网的效果,云纹修改更加直接。 图案设计:可以设计任意的回位相接的网格图案,以及各种几何花型和中、英文字符。 图象开路:根据各种印花工艺要求对图象进行开路遮边,操作简单,只需画一条开路曲 线即可。 云纹挂网:对不同的图象和不同的工艺要求有不同的网型和任何角度、任何线数的网点 可供选择。 激光照排:可以对单回位的图形直接连晒(开路连晒)、叠扩发排;对单回位云纹图象 直接挂网、 连晒(开路连晒)发排。 直接制网:将电脑设计图案直接喷射制网,省略胶片制作的中间步骤和中间误差,耗材 降低,精 度提高,缩短生产周期。 数码喷印:一种不需要分色制版的环保型印花系统;将电脑设计的图案直接印制在面料 上,可按 理想心意创意设计;可作个性化、多品种的小批量生产。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值