【问题描述】
小A 和小B 在做游戏。
他们找到了一个n 行m 列呈网格状的画板。小A 拿出了p 支不同颜色的画笔,开始在上面涂色。看到小A 涂好的画板,小B 觉得颜色太单调了,于是把画板擦干净,希望涂上使它看起来不单调的颜色(当然,每个格子里只能涂一种颜色)。小B 想知道一共有多少种不单调的涂色方案。我们定义一个涂色方案是不单调的,当且仅当任意相邻两列都出现了至少q 种颜色。

题解:

都能看出来这是道矩乘题。但是比较变态。

先不考虑矩阵,状态是f[ i ][ j ],指前i列已经填好,第i列共有j种不同颜色的方案数。

这里需要一个另外的g,用来算将j种颜色填入n个格子的方案数

先来看一下g:(我用的是容斥)

    for(int i=;i<=;i++)
{
g[i]=fast(i,n);//(快速幂)
for(int j=;j<i;j++)
{
g[i] = ((g[i] - g[j]*C[i][j]%MOD)%MOD+MOD)%MOD;
}
}

什么意思?

首先什么都不考虑,n个格子都有i种选择,得到i^n。

但是有个问题,就是原来让他有j种颜色,但是最终不够j。因此还要减掉g[ k ]*C[ j ][ k ]。

这样g就求完了。

然后就是状态转移方程了。

设前一列有k种颜色,当前列有j种颜色。

我分了几种情况:

1.k+j<q。这样无法转移……

2.k>=q或j>=q,这样当前列可以随便选,式子比较简单粗暴:

3.其他情况。这里需要枚举j中与k重合的有多少种。

最后转矩阵乘法。时间复杂度O(n^3*log m)。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MOD 998244353
#define ll long long
ll C[][],g[];
int n,m,p,q;
ll fast(ll x,int y)
{
ll ret = 1ll;
while(y)
{
if(y&)ret=ret*x%MOD;
x=x*x%MOD;
y>>=;
}
return ret;
}
struct mt
{
ll s[][];
}j0,j1;
mt operator * (mt a,mt b)
{
mt ret;
for(int i=;i<=p;i++)
{
for(int j=;j<=p;j++)
{
ret.s[i][j]=;
for(int k=;k<=p;k++)
{
(ret.s[i][j]+=a.s[i][k]*b.s[k][j]%MOD)%=MOD;
}
}
}
return ret;
}
void init()
{
C[][]=;
for(int i=;i<=;i++)
{
C[i][]=;
for(int j=;j<=i;j++)
{
C[i][j]=(C[i-][j-]+C[i-][j])%MOD;
}
}
for(int i=;i<=;i++)
{
g[i]=fast(i,n);
for(int j=;j<i;j++)
{
g[i] = ((g[i] - g[j]*C[i][j]%MOD)%MOD+MOD)%MOD;
}
}
for(int j=;j<=p;j++)
{
for(int k=;k<=p;k++)
{
if(j+k<q)
{
j0.s[j][k]=;
}else
{
if(k<q&&j<q)
{
for(int x=max(q,j)-k;x<=j&&x+k<=p;x++)
{
(j0.s[j][k]+=C[k][j-x]*C[p-k][x]%MOD*g[j]%MOD)%=MOD;
}
}else
{
j0.s[j][k]=C[p][j]*g[j]%MOD;
}
}
}
}
for(int i=;i<=p;i++)j1.s[i][]=g[i]*C[p][i]%MOD;
}
mt fastt(mt x,int y)
{
mt ret;
ret=x;
y--;
while(y)
{
if(y&)ret=ret*x;
x=x*x;
y>>=;
}
return ret;
}
int main()
{
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&p,&q);
init();
mt ans = fastt(j0,m-);
ans = ans*j1;
ll as = ;
for(int i=;i<=p;i++)
as = (as+ans.s[i][])%MOD;
printf("%lld\n",as);
return ;
}

NOIp十连测 涂色游戏的更多相关文章

  1. hdu 4559 涂色游戏(SG)

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

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

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

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

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

  4. LYDSY模拟赛day3 涂色游戏

    /* 非常好的题 */ #include <cstdio> #include <iostream> #include <cstdlib> #include < ...

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

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

  6. 【矩阵乘优化DP】涂色游戏

    题目大意 用 \(p\) 种颜色填 \(n\times m\) 的画板,要求任意相邻两列的颜色数都不少于 \(q\) ,求方案数. 数据范围 \(1\leq n\leq 100,1\leq m\leq ...

  7. hdu 4559 涂色游戏 博弈论

    构造SG函数:sg[i]表示2*i的sg值!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm ...

  8. [NOI Online #2 提高组]涂色游戏 题解

    题目描述 你有 1020 个格子,它们从 0 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色: 编号是 p1 倍数的格子(包括 0号格子,下同)染成红色. 编号是 p2 倍数的格子染成 ...

  9. noip2016十连测round3

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

随机推荐

  1. 关于solr云相关知识

    1.认识系统架构 1.1.集群概述 1.1.1.单点服务器的问题 我们之所以要学习集群,是因为单点服务器,存在一系列的问题. 我们以前学习的JavaEE项目,都是部署在一台Tomcat上,所有的请求, ...

  2. asp.net mvc 学习资料

    ASP.NET MVC 的 WebGrid 的 6 个重要技巧 http://www.oschina.net/translate/webgrid-in-asp-net-mvc-important-ti ...

  3. 【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)

    前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭配 6 SWT复杂空间与布局搭配 7 SWT布局详解 ...

  4. SpringBoot项目docker化

    前言 有很多种方案构建Docker镜像,包括Dockerfile构建.maven插件构建,这里我使用了最简单的Dockerfile构建的. 一.安装Docker 我的虚拟机系统是CentOS7,需要是 ...

  5. NOIP-2018

    时隔一年,再度踏入NOIp的考场,内心感慨万分 Day0 在中巴上昏睡了3h++,终于到了长沙理工大学,国际学术交流中心......不太对,好像是国际交流中心与综合实验楼连线--理工大学的另一个大门外 ...

  6. 贪心+枚举/哈希表 HDOJ Trouble

    题目传送门 题意:5个集合,每个集合最多200个数字,问是否每个集合挑一个数加起来和为0. 分析:显然n^5的程序果断超时,甚至n^3logn的二分也过不了.想n^3的方法,既然判断有没有,那么可以将 ...

  7. 题解报告:hdu1995汉诺塔V(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 Problem Description 用1,2,...,n表示n个盘子,称为1号盘,2号盘,. ...

  8. .Net Framework Client Profile 和 .Net Framework的区别[转]

    原文链接 VS2010默认是以.Net Framework Client Profile为生成环境的,如果需要更多的功能,应该调用.Net Framework.

  9. Ubuntu卸载软件包

    sudo apt-get autoremove --purge mysql-server-5.0 ,purge连同配置文件一起删除,autoremove自动卸载依赖包sudo apt-get remo ...

  10. RabbitMQ五:生产者--队列--多消费者

    一.生成者-队列-多消费者(前言) 上篇文章,我们做了一个简单的Demo,一个生产者对应一个消费者,本篇文章就介绍 生产者-队列-多个消费者,下面简单示意图 P 生产者    C 消费者  中间队列 ...