首页 > 其他分享 >AGC02F Leftmost Ball

AGC02F Leftmost Ball

时间:2024-07-24 20:07:24浏览次数:14  
标签:CI Ball ifac int AGC02F inline mul Leftmost mod

Counting 苦手本来都准备白兰了,但祁神发现了关键的性质然后就发现可做了

稍作观察我们就可以发现对于一个最终合法的序列,其任意一个前缀中白球的数量都必须大于等于这段前缀的颜色数

直接对长度为 \(n\times k\) 的序列 DP 复杂度显然不能接受,不过我们发现我们只关心每种颜色出现的第一个球的位置,对于剩下的 \(k-2\) 个球其实往后随便怎么放都不影响序列的合法性

设状态 \(f_{i,j}\) 表示已经放了 \(i\) 个白球,之前共出现了 \(j\) 种颜色,且这 \(j\) 种颜色的球已经全部放完的方案数,任何时刻都需要保证 \(i\ge j\)

转移分两类,一种是放一个白球,这种情况就是 \(f_{i+1,j}\leftarrow f_{i,j}\),否则考虑放一个之前没出现的颜色的球

首先选颜色有 \(n-j\) 种方案,这种颜色剩下的 \(k-2\) 个球可以放在后面剩下的 \(n\times k-i-1-j\times (k-1)\) 个位置,用组合数算一下即可

总复杂度 \(O(nk)\),注意特判 \(k=1\) 的情形

#include<cstdio>
#include<iostream>
#define RI register int
#define CI const int&
using namespace std;
const int N=2005,mod=1e9+7;
int n,k,f[N][N],fact[N*N],ifac[N*N];
inline void inc(int& x,CI y)
{
    if ((x+=y)>=mod) x-=mod;
}
inline int quick_pow(int x,int p=mod-2,int mul=1)
{
    for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
inline void init(CI n)
{
    RI i; for (fact[0]=i=1;i<=n;++i) fact[i]=1LL*fact[i-1]*i%mod;
    for (ifac[n]=quick_pow(fact[n]),i=n-1;i>=0;--i) ifac[i]=1LL*ifac[i+1]*(i+1)%mod;
}
inline int C(CI n,CI m)
{
    if (n<0||m<0||n<m) return 0;
    return 1LL*fact[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int main()
{
    RI i,j; scanf("%d%d",&n,&k);
    if (k==1) return puts("1"),0;
    init(n*k); f[0][0]=1;
    for (i=0;i<=n;++i) for (j=0;j<=i;++j)
    {
        if (!f[i][j]) continue;
        //printf("f[%d][%d] = %d\n",i,j,f[i][j]);
        inc(f[i+1][j],f[i][j]);
        inc(f[i][j+1],1LL*f[i][j]*(n-j)%mod*C(n*k-i-1-j*(k-1),k-2)%mod);
    }
    return printf("%d",f[n][n]),0;
}

标签:CI,Ball,ifac,int,AGC02F,inline,mul,Leftmost,mod
From: https://www.cnblogs.com/cjjsb/p/18321617

相关文章

  • CF1983E I Love Balls
    题意\(n\)个小球,有\(k\)个特殊小球,两个人轮流随机拿,每个小球有权值,如果拿到特殊球就再拿一个,问两个人的期望得分。题解关键1如果没有特殊小球,那么每个球是等价的,计算期望的时候可以直接用平均值作为一个小球的权值,把每个小球的权值都看成平均值关键2把拿取操作看成一个序......
  • CF1983E I Love Balls
    Problem-E-Codeforces爱丽丝和鲍勃玩摸球游戏。有\(n\)个球,其中\(k\)个是特殊球。每个球都有其价值。他们轮流且不放回地摸球,每回合随机摸一个球并获得该球的价值。特别地,如果摸到了特殊球(且至少还有一个球)则这名玩家继续摸球。如果摸到的是普通球,则换人摸球。这样轮流......
  • 数据仓库Kimball模式
    数据仓库模式是构建和设计数据仓库的方法论,而Kimball的数据仓库模式是其中一种常用的模式。Kimball的数据仓库模式以业务过程为核心,通过将数据组织成星型模型或雪花模型,实现数据的快速查询和分析。以下是对Kimball模式的简介、优势和适用场景的介绍。简介:Kimball的数据仓库模......
  • 【维度建模】【第二章】Kimball维度建模技术概述
    2.1基本概念2.1.2维度建模研讨维度模型应该由业务、模型设计者通过充分的讨论得到。2.1.3四步骤维度设计过程维度设计期间主要设计一下四个主要的决策:选择业务过程声明粒度确认维度确认事实2.1.4业务过程表示一次业务的行为。例如获得订单、学生课程注册,2.1.5粒度粒......
  • C. Tenzing and Balls
    链接:https://codeforces.com/problemset/problem/1842/Corhttps://www.luogu.com.cn/problem/CF1842C大概的思路就是利用dp[i]记录前i个数据最多消掉的数字个数,然后对∀j:a[i]==a[j]&&j<i进行dp[i]=dp[j-1]+i-j+1的递推优化:代码:#define_CRT_SECURE_NO_WARNI......
  • C - Merge the balls
    C-Mergetheballshttps://atcoder.jp/contests/abc351/tasks/abc351_c 思路使用stack记录序列路径对栈顶两个元素尝试做缩减处理。 Codehttps://atcoder.jp/contests/abc351/submissions/52873456intn;stack<longlong>sq;intmain(){cin>>n;......
  • Colored Balls
    这道题目的模型倒是可以记住我们发现这个配对很像摩尔投票,所以考虑原数列是否有主元素对于一个集合,我们选出其中最大的\(a_i\),假设剩余的\(a\)的和小于等于\(a_i\)(此时有主元素),那么比较显而易见的就是最终会分出\(a_i\)个组;否则的话,我们考虑下界\(\lceil\frac{\suma}{2}\rcei......
  • CodeForces 1951G Clacking Balls
    洛谷传送门CF传送门考虑用相邻两个球之间的距离来描述一个状态。设距离序列为\(a_1,a_2,\ldots,a_k\)(忽略\(0\))。考虑鞅与停时定理,设一个状态的势能为\(\sum\limits_{i=1}^kf(a_i)\),一次操作能使得势能期望减少\(1\)。那么:\[1=\frac{1}{n}\sum\limits_{i=1}^k......
  • D. Colored Balls
    D.ColoredBallsThereareballsof$n$differentcolors;thenumberofballsofthe$i$-thcoloris$a_i$.Theballscanbecombinedintogroups.Eachgroupshouldcontainatmost$2$balls,andnomorethan$1$ballofeachcolor.Considerall$2^n$set......
  • Learning Disentangled Graph Convolutional Networks Locally and Globally论文阅读
    LearningDisentangledGraphConvolutionalNetworksLocallyandGlobally论文阅读笔记Abstract存在的问题:​ 尽管现有的gcn取得了成功,但它们通常忽略了现实世界图中通常出现的纠缠潜在因素,这导致了无法解释的节点表示。更糟糕的是,虽然重点放在局部图信息上,但整个图的全局知......