/*
非常好的题
*/
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
const int N=,mod=;
int c[N][N],s[N][N],f[N][N];
struct mat{
int a[N][N];
}ans,tmp;
int p;
mat operator*(mat a,mat b){
int i,j,k;mat c;
for(i=;i<=p;i++)
for(j=;j<=p;j++){
c.a[i][j]=;
for(k=;k<=p;k++) c.a[i][j]=(c.a[i][j]+(ll)a.a[i][k]*b.a[k][j])%mod;
}
return c;
}
int ksm(int x,int y){
int tmp=x,ans=;
while(y){
if(y&) ans=(ll)ans*tmp%mod;
tmp=(ll)tmp*tmp%mod;
y>>=;
}
return ans;
}
int main(){
//freopen("color.in","r",stdin);
//freopen("color.out","w",stdout);
int n,m,q,i,j,k,x,sum=;
scanf("%d %d %d %d",&n,&m,&p,&q);
c[][]=;//组合数
for(i=;i<=p;i++){
c[i][]=c[i][i]=;
for(j=;j<i;j++)
c[i][j]=(c[i-][j-]+c[i-][j])%mod;//求组合数的过程
}
f[][]=;//i个格子恰好涂j种颜色的方案数
for(i=;i<=n;i++)
for(j=;j<=p;j++)
f[i][j]=((ll)f[i-][j-]*(p-j+)+(ll)f[i-][j]*j)%mod;//分两类讨论,前i-1个格子中使用j-1种颜色而这一格新增一种颜色,前i-1个格子使用j种颜色,这一格涂的颜色在这j种颜色之中
/*
tmp就是题解中所提到的转移函数,a[i][j]就是前一列涂了i个颜色而下一列涂了j个颜色的方案
我们之前已经处理出了i个格子j种颜色的方案数,注意这个方案数是不限制颜色的,也就是说这个j种颜色具体是什么不确定,要想把他确定下来,必须要除c(p,j)(排列组合原理)
考虑两行之间的转移,相邻两个格子分别用了j,k种颜色,两种颜色根据并的颜色的不同会产生不同的结果,枚举这个并的颜色的数量,下界在必须颜色数和两个集合颜色的种数中选取最大值,上界在两集合颜色总数和总共可使用的颜色中取最小值
并的颜色和不同的颜色分别用排列组合算数量再根据乘法原理合起来,最后乘以前一行确定颜色的方案数(确定颜色后方案之间是等价的)
*/
for(j=;j<=p;j++)
for(k=;k<=p;k++){
for(x=max(q,max(j,k));x<=min(j+k,p);x++)
tmp.a[j][k]=(tmp.a[j][k]+(ll)c[j][j+k-x]*c[p-j][x-j])%mod;
tmp.a[j][k]=(ll)f[n][k]*tmp.a[j][k]%mod*ksm(c[p][k],mod-)%mod;
//printf("%d ",tmp.a[j][k]);
}
m--;
for(i=;i<=p;i++) ans.a[i][i]=;//单位矩阵
//假设转移两遍,a[i][j] = sum(a[i][k]*a[k][j])(1<=i,j<=p)符合矩阵乘法的形式,所以可以用矩阵快速幂
while(m){
if(m&) ans=ans*tmp;
tmp=tmp*tmp;m>>=;
}
for(i=;i<=p;i++)
for(j=;j<=p;j++)
sum=(sum+(ll)f[n][i]*ans.a[i][j])%mod;//转移
printf("%d\n",sum);
return ;
}

LYDSY模拟赛day3 涂色游戏的更多相关文章

  1. 联赛模拟测试5 涂色游戏 矩阵优化DP

    题目描述 分析 定义出\(dp[i][j]\)为第\(i\)列涂\(j\)种颜色的方案数 然后我们要解决几个问题 首先是求出某一列涂恰好\(i\)种颜色的方案数\(d[i]\) 如果没有限制必须涂\( ...

  2. LYDSY模拟赛day3 序列

    NOIP不考可持久,弃坑

  3. LYDSY模拟赛day3 平均数

    [ 问题描述]有一天, 小 A 得到了一个长度为 n 的序列.他把这个序列的所有连续子序列都列了出来, 并对每一个子序列都求了其平均值, 然后他把这些平均值写在纸上, 并对它们进行排序,最后他报出了第 ...

  4. [CSP-S模拟测试]:涂色游戏(DP+组合数+矩阵快速幂)

    题目描述 小$A$和小$B$在做游戏.他们找到了一个$n$行$m$列呈网格状的画板.小$A$拿出了$p$支不同颜色的画笔,开始在上面涂色.看到小$A$涂好的画板,小$B$觉得颜色太单调了,于是把画板擦 ...

  5. hdu 4559 涂色游戏(SG)

    在一个2*N的格子上,Alice和Bob又开始了新游戏之旅. 这些格子中的一些已经被涂过色,Alice和Bob轮流在这些格子里进行涂色操作,使用两种涂色工具,第一种可以涂色任意一个格子,第二种可以涂色 ...

  6. NOIp十连测 涂色游戏

    [问题描述]小A 和小B 在做游戏.他们找到了一个n 行m 列呈网格状的画板.小A 拿出了p 支不同颜色的画笔,开始在上面涂色.看到小A 涂好的画板,小B 觉得颜色太单调了,于是把画板擦干净,希望涂上 ...

  7. hdu 4559 涂色游戏(对SG函数的深入理解,推导打SG表)

    提议分析: 1 <= N <= 4747 很明显应该不会有规律的,打表发现真没有 按题意应该分成两种情况考虑,然后求其异或(SG函数性质) (1)找出单独的一个(一列中只有一个) (2)找 ...

  8. 【2018.10.20】noip模拟赛Day3 飞行时间

    今天模拟赛题目 纯考输入的傻逼题,用$scanf$用到思想僵化的我最终成功被$if$大法爆$0$了(这题只有一组$100$分数据). 输入后面那个$(+1/2)$很难$if$判断,所以我们要判两个字符 ...

  9. LYDSY模拟赛day9 2048

    /* 大模拟题,做的时候思路还是比较清晰的 */ #include<iostream> #include<cstdio> #include<string> #inc ...

随机推荐

  1. Zabbix网络自动发现规则和自动添加hosts及link模板

    Version: zabbix 3.0 一.配置网络发现规则 Device uniqueness criteria:选择主机名作为唯一标识(Configuation Hosts中显示的NAME) 二. ...

  2. iOS WebView调用JS的一个小坑

    假如调用一个函数,传入的参数为String,要以这样的格式传入: let resultStr="1234" self.webView.stringByEvaluatingJavaS ...

  3. Sublime Text 3 编辑器使用

    今天打开别人的python脚本,想找IDE的时候,本来在eclipse中有安装python插件,但是好像是太旧了,很多sys的方法找不着 又上网找了一下python的IDE工具,看好多人在歌颂这个Su ...

  4. android toast几种使用方法

    toast经常会用到,今天做个总结,特别是自定义toast的布局,值得一看. 一.默认展示 // 第一个参数:当前的上下文环境.可用getApplicationContext()或this // 第二 ...

  5. gcc编译与gdb调试简要步骤

    http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...

  6. BZOJ4620: [Wf2016]What Really Happened on Mars?

    题意比较难懂?反正我为此特地查了优先级倒置和优先级置顶协议是什么. 读懂题以后就好办了,直接模拟即可. 由于数据范围较小,写得比较暴力,应该还有很大优化空间. #include<cstdio&g ...

  7. Objective-C复合

    正所谓复合,便是定义的这个类中的成员是另外类的实例方法. 也就是把其他对象作为自身的题部分,以提升自身的功能, 就相当于C语言中的函数嵌套.下面是一段代码(多个文件放在一块了): /***Comput ...

  8. [转发]Dumps of system information with Apple computers

    In this article, I gathered up all the dumps, who found. If you see something new table will be upda ...

  9. IT项目管理感悟

    做项目的时候,切记做好需求分析,列出需求清单,需要考虑好每一个细节,一个机柜是否需要PDU,KVM,服务器放置位置,放置几台服务器,服务器是几U的,IP段规划都需要事先规划好,并且文档化.---记住这 ...

  10. Flash Builder 4.7 破解

    http://litech.diandian.com/post/2013-03-22/40049178994 Adobe Flash Builder 4.7 For Mac 破解 和Photoshop ...