【弱省胡策】Round #5 Count

太神仙了。

\(DP\)做法

设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\)个块染了\(k\)颜色。

\[\displaystyle f_{n,m,d,k}=\sum_{i=1}^nC_n^i\cdot (C_m^d)^i\cdot f_{i,m-d,0,k-1}\cdot f_{n-i,m,d+1,k}
\]

边界条件特别烦,当\(n=1\)或者\(n==1\&\&m==0\)时\(f\)的值为\(1\)。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 25
#define M 55 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const ll mod=1e9+7;
int n,m,k;
ll f[N][M][M][105];
ll C[M][M]; ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
} int main() {
for(int i=0;i<=50;i++)
for(int j=0;j<=i;j++)
C[i][j]=(!j||i==j)?1:(C[i-1][j-1]+C[i-1][j])%mod;
n=Get(),m=Get(),k=Get(); memset(f,0,sizeof(f));
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
for(int d=0;d<=m+1;d++)
for(int c=0;c<=k;c++)
if(!i||(i==1&&j==0))
f[i][j][d][c]=1; for(int c=1;c<=k;c++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
for(int d=j;d>=0;d--) {
for(int q=1;q<=i;q++) {
(f[i][j][d][c]+=C[i][q]*ksm(C[j][d],q)%mod*f[q][j-d][0][c-1]%mod*f[i-q][j][d+1][c])%=mod;
}
(f[i][j][d][c]+=f[i][j][d+1][c])%=mod;
}
}
}
}
cout<<f[n][m][0][k];
return 0;
}

容斥做法

参考Luogu P4463的容斥做法。

我们先定义两行同构为:这两行中每种颜色出现次数相同。

我们设\(f_n\)表示\(n\)行\(m\)列且任意两行不同构的方案数。设\(s_i\)表示有\(i\)行矩形同构的方案数。

然后我们考虑加入第\(n+1\)行。我们枚举至少有\(i\)行与第\(n+1\)行同构的方案数为\(g_i\),则:

\[g_i=s_i\cdot f_{n-i}
\]

我们设恰好有\(i\)行与第\(n+1\)行矩形同构的方案数为\(h_i\),则:

\[g_i=h_i+\binom{i+1}{i}h_{i+1}
\]

因为剩下的\(n-i\)行两两不同构,所以最多有\(i+1\)行与第\(n+1\)行同构。

设\(g_i\)的容斥系数为\(c_i\)。考虑\(h_i\)被计算的次数为\(c_i+\binom {i}{i-1}c_{i-1}\),所以

\[c_i+\binom {i}{i-1}c_{i-1}=[i==0]
\]

因为\(c_0=0\),所以我们就可以解出\(c_i=(-1)^i i!\)。

关于计算\(s_i\):

\[s_i=(\frac{m!}{\prod num_k!})^i
\]

其中\(num_k\)表示第\(k\)种颜色出现的次数。

这个其实就可以枚举\(i\)之后做背包,然后显然可以用\(NTT\)优化,于是数据范围可以扩大。

(懒得写\(MTT\)就改了模数)

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 205
#define M 205 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const ll mod=998244353;
int n,m,k;
ll fac[M],ifac[M]; ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
}
ll f[N],g[N];
ll C(int n,int m) {return fac[n]*ifac[m]%mod*ifac[n-m]%mod;} ll NTT(ll *a,int d,int flag) {
static ll G=3;
static int rev[M<<2];
int n=1<<d;
for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<d-1);
for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int s=1;s<=d;s++) {
int len=1<<s,mid=len>>1;
ll w=flag==1?ksm(G,(mod-1)/len):ksm(G,mod-1-(mod-1)/len);
for(int i=0;i<n;i+=len) {
ll t=1;
for(int j=0;j<mid;j++,t=t*w%mod) {
ll u=a[i+j],v=a[i+j+mid]*t%mod;
a[i+j]=(u+v)%mod;
a[i+j+mid]=(u-v+mod)%mod;
}
}
}
if(flag==-1) {
ll inv=ksm(n,mod-2);
for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
}
} void pre(int n) {
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
ifac[n]=ksm(fac[n],mod-2);
for(int i=n-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
} ll A[M<<2],ans[M<<2];
ll s[N][M]; void ksm(ll *A,ll *ans,int d,int x) {
memset(ans,0,sizeof(ans));
ans[0]=1;
for(;x;x>>=1) {
if(x&1) {
NTT(ans,d,1),NTT(A,d,1);
for(int i=0;i<1<<d;i++) ans[i]=ans[i]*A[i]%mod;
NTT(ans,d,-1),NTT(A,d,-1);
for(int i=1<<d-1;i<1<<d;i++) ans[i]=0;
}
NTT(A,d,1);
for(int i=0;i<1<<d;i++) A[i]=A[i]*A[i]%mod;
NTT(A,d,-1);
for(int i=1<<d-1;i<1<<d;i++) A[i]=0;
}
} ll S[N]; int main() {
n=Get(),m=Get(),k=Get();
pre(N-5);
int len=m*k;
int d=ceil(log2(m<<1|1));
for(int i=1;i<=n;i++) {
memset(A,0,sizeof(A));
for(int j=0;j<=m;j++) {
A[j]=ksm(ifac[j],i);
}
memset(ans,0,sizeof(ans));
ksm(A,ans,d,k);
S[i]=ans[m]*ksm(fac[m],i)%mod;
} f[0]=1;
for(int i=1;i<=n;i++) {
for(int j=0;j<i;j++) {
g[j]=C(i-1,j)*f[i-j-1]%mod*S[j+1]%mod;
}
for(int j=i-1;j>=0;j--) g[j]=(g[j]-g[j+1]*(j+1)%mod+mod)%mod;
f[i]=g[0];
}
cout<<f[n]; return 0;
}

【弱省胡策】Round #5 Count的更多相关文章

  1. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  2. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  3. 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)

    DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...

  4. 【弱省胡策】Round #5 Construct 解题报告

    这个题是传说中的 Hack 狂魔 qmqmqm 出的构造题.当然要神. 这个题的本质实际上就是构造一个图,然后使得任意两点间都有长度为 $k$ 的路径相连,然后对于任意的 $i < k$,都存在 ...

  5. 【弱省胡策】Round #5 Handle 解题报告

    这个题是我出的 sb 题. 首先,我们可以得到: $$A_i = \sum_{j=i}^{n}{j\choose i}(-1)^{i+j}B_j$$ 我们先假设是对的,然后我们把这个关系带进来,有: ...

  6. 【弱省胡策】Round #6 String 解题报告

    感觉这个题好神啊. 首先我们只管 $a = b$ 的情况,那么我们自然就可以把这个串对 $a$ 取模,然后用 KMP 求出能弄出几个其他的 B 串. 具体就是把串先倍长,然后倒过来,然后求 $Next ...

  7. 【弱省胡策】Round #7 Rectangle 解题报告

    orz PoPoQQQ 的神题. 我的想法是:给每一个高度都维护一个 $01$ 序列,大概就是维护一个 $Map[i][j]$ 的矩阵,然后 $Map[i][j]$ 表示第 $i$ 根柱子的高度是否 ...

  8. 【弱省胡策】Round #0 Flower Dance DP

    Flower Dance Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://162.105.80.126/contest/%E3%80%90%E ...

  9. 【Contest Hunter【弱省胡策】Round #0-Flower Dance】组合数学+DP

    题目链接: http://ch.ezoj.tk/contest/%E3%80%90%E5%BC%B1%E7%9C%81%E8%83%A1%E7%AD%96%E3%80%91Round%20%230/F ...

随机推荐

  1. OOP设计模式在路上(一)——简单工厂模式

    前言 目前以LabVIEW为主要开发工具,熟悉常规开发框架(队列+状态机),个人用得比较多也感觉比较好用和强大的(JKI,AMC),也用它们开发过一些测试平台,但感觉到了一个瓶颈期,想寻求突破,提升L ...

  2. 继续封装个 Volley 组件

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 前面已经封装了很多常用.基础的组件了:base-module, 包括了: crash 处理 常用工具类 apk 升级处理 log 组 ...

  3. sass安装和语法

    1.简介 sass 它的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.这被叫做“css预处理器”(css preprocessor).它提供了很便利的语法,节省了我 ...

  4. 2018-08-13 Head First OO分析设计一书略读与例子中文化

    注: 此笔记仅为个人学习此教程的布局和材料组织之用. 如有兴趣请自行详阅. 第一章是以吉他商店的存货系统作例子. 第二章设计有狗洞的门. 第三章对第二章基础上, 更改需求后对应设计. 第四章继续改进此 ...

  5. Android开发学习之RecyclerView

    1.在app/build.gradle中添加RecyclerView依赖 implementation 'com.android.support:recyclerview-v7:28.0.0' 注意依 ...

  6. 性能优化7--App瘦身

    1. 前言 如果你对App优化比较敏感,那么Apk安装包的大小就一定不会忽视.关于瘦身的原因,大概有以下几个方面: 对于用户来说,在功能差别不大的前提下,更小的Apk大小意味更少的流量消耗,也意味着更 ...

  7. 如何训练AI

    如何训练AI让其更加智能,而不是用特定的代码控制AI逻辑! AI守则 首先应该为机器人设置几个必要信息: 目标 规则 能力 目标,规定机器人要做到什么. 规则,规定机器人的限制,不能做什么. 能力,规 ...

  8. PostgreSQL date_trunc() 和timestamp

    timestamp 01.SELECT now()::timestamp + '1 year'; 02.SELECT now()::timestamp + '1 month'; 03.SELECT n ...

  9. JHipster生成微服务架构的应用栈(四)- 网关微服务示例

    本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...

  10. 新闻思考-阿里进军游戏产业,苹果发力ARM芯片

    2018.04.03 大家好,这是我开通博客的第一篇文章,我希望在这里分享我的知识,也学习更多的知识,希望大家学习愉快. 阿里进军游戏产业,拿下旅行青蛙的代理权.腾讯一直在进攻阿里的核心业务:电商和支 ...