/*
非常好的题
*/
#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. python grammar、C/C++ Python Parsing Engine

    catalog . Python语言简介 . Python模块 . 嵌入式Python解析引擎: C++调用Python . Python 调用 C (base) . 扩展Python语法解析器功能: ...

  2. PHP中的一个”坑“

    说一个极有可能在工作中遇到的问题——foreach的引用 foreach $arr = range(1,3); //[1,2,3] foreach($arr as &$val) { } for ...

  3. python 内置函数和函数装饰器

    python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...

  4. Android中定时执行任务的3种实现方法

    在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,java的实现方式)二.采用Handler的postDelayed(Runn ...

  5. 如何写出优雅的css代码 ?

    如何写出优雅的css代码 ? 对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于 ...

  6. Django admin美化插件suit

    Django Suit 效果 使用前django页面 使用后django页面 安装 官方文档 http://django-suit.readthedocs.io/en/develop/index.ht ...

  7. WinForm------ToolTipController与GridControl的连用

    1.拖入一个ToolTipController控件,和一个GridControl控件 2.设置GridControl中的GridView的中的属性ToolTipController为刚刚拖入的Tool ...

  8. elasticsearch api

    count curl -XGET http://21.3.5.121:9200/ipv4geo/service/_count -d '{"query":{"match&q ...

  9. C#的两个大方向

    http://zhidao.baidu.com/link?url=wG9G_EaT3tRd5_7ndU3vpFqmuc6S8N7F5TpBYsDPEui3HQ-wcU7nqw-_aRpIwtXQbC3 ...

  10. header的安全配置指南

    0x00 背景 在统计了Alexa top 100万网站的header安全分析之后(2012年11月 - 2013年3月 - 2013年11月),我们发现其实如何正确的设置一个header并不是一件容 ...