涂色游戏



题解:
推一推公式。
我们让f[i][j]表示第i列有j种颜色的方案总数,k表示i-1列用了多少种颜色,l表示第i列用了多少种没有在i-1列出现的颜色,G(i,j)表示i个格子涂j种颜色的方案总数。
则f[i][j]=Σ(f[i−1][k]∗C(k,i−l)∗C(p−k,l)∗G(n,j))f[i][j]=Σ(f[i−1][k]∗C(k,i−l)∗C(p−k,l)∗G(n,j))。其中要满足k+l>=qk+l>=q。
G(i,j)怎么求?
可以得到G(i,j)=ji−Σ(g[i][k]∗c[j][k])G(i,j)=ji−Σ(g[i][k]∗c[j][k]),其中k=1..j−1k=1..j−1。这个式子代表先get到所有的涂法,再减去少于j种颜色的方案总数。
但是我们发现列数为1e9,怎么办?
太显然了吧!^ ^直接上矩阵快速幂优化。
在最后orz orz %%%zjr大佬。老中医保佑!
代码:

#include<cstdio>
#include<cstring>
#pragma GCC optimize (3)
typedef long long ll;
const int N=105;
const ll mod=998244353;
int n,m,p,q;
ll ans,c[N][N],g[N][N];
ll fast_pow(ll a,int x){ll res=1;while(x){if(x&1){res*=a;res%=mod;}x>>=1;a*=a;a%=mod;}return res;
}
struct matrix{ll a[N][N];matrix(){memset(a,0,sizeof(a));}matrix operator * (const matrix &b) const{matrix c;for(int i=1;i<=p;i++){for(int j=1;j<=p;j++){for(int k=1;k<=p;k++){c.a[i][j]+=a[i][k]*b.a[k][j];c.a[i][j]%=mod;}}}return c;}
}bg,x;
int main(){scanf("%d%d%d%d",&n,&m,&p,&q);if(p<q){puts("0");return 0;}for(int i=0;i<=p;i++){c[i][0]=c[i][i]=1;}for(int i=1;i<=p;i++){for(int j=1;j<=i;j++){c[i][j]=c[i-1][j-1]+c[i-1][j];c[i][j]%=mod;}}for(int i=1;i<=n;i++){for(int j=1;j<=i&&j<=p;j++){g[i][j]=fast_pow(j,i);for(int k=1;k<j;k++){g[i][j]-=g[i][k]*c[j][k]%mod;g[i][j]=(g[i][j]%mod+mod)%mod;}}}for(int i=1;i<=p&&i<=n;i++){for(int j=1;j<=p&&j<=n;j++){for(int k=0;k<=i;k++){if(j+k<q){continue;}x.a[j][i]+=c[j][i-k]*c[p-j][k]%mod*g[n][i]%mod;x.a[j][i]%=mod;}}}for(int i=1;i<=p;i++){bg.a[1][i]=c[p][i]*g[n][i]%mod;}m--;while(m){if(m&1){bg=bg*x;}m>>=1;x=x*x;}for(int i=1;i<=p;i++){ans+=bg.a[1][i];ans%=mod;}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/2016gdgzoi471/p/9476880.html

【noip2016十连测round3】T3 涂色游戏 【矩阵快速幂优化dp】相关推荐

  1. 【NOIP2016提高组11.7】涂色游戏

    题目大意 给你n行m列的网格,每个格子可以涂上一种颜色,一共有p种颜色,要求相邻两行的颜色总数不小于q.求方案数模998244353的结果. n≤100 m≤10910^9 q≤p≤100 分析 首先 ...

  2. 【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)

    Problem C: [noip2016十连测第三场]序列 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 78  Solved: 32 [Submi ...

  3. 【NOIP 模拟赛】平均数 涂色游戏 序列题解

    吐槽(完跪):神tmNOIP模拟赛,看到大题头根本高级数据结构什么的想都没想,结果死的很惨,第三题竟然要可持久化线段树,这NOIP我服了. 平均数: 这道题40分相信大家都能拿到,剩下的60分讲真考验 ...

  4. qduoj LC的涂色游戏(快速幂)

    题目链接:https://qduoj.com/problem/12/点击打开链接 LC的涂色游戏 发布时间: 2015年9月19日 21:42   时间限制: 1000ms   内存限制: 256M ...

  5. c语言写一个格子涂色的游戏,不一样的涂色游戏小程序,这个魔力贴贴涂色游戏有点意思...

    原标题:不一样的涂色游戏小程序,这个魔力贴贴涂色游戏有点意思 30000+游戏爱好者已加入我们! 沐沐带你发现好游戏! <魔力贴贴>游戏小程序好玩吗? <魔力贴贴>小游戏怎么玩 ...

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

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

  7. NOI Online #2 提高组 第一题:涂色游戏

    NOI Online #2 提高组 第一题:涂色游戏 前言 题目 解析 代码 前言 呦呵,这道题我竟然爆零了 而且我的暴力dfs死循环了!\bold{\Large\xcancel\text{而且我的暴 ...

  8. qduoj LC的涂色游戏

    LC的涂色游戏 发布时间: 2015年9月19日 21:42   时间限制: 1000ms   内存限制: 256M 描述 LC是实验室传说级的大神,最近喜欢上了涂色游戏,现在纸上有n块空白区域,lc ...

  9. LYDSY模拟赛day3 涂色游戏

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

最新文章

  1. mysql2005备份_创建完整数据库备份 - SQL Server | Microsoft Docs
  2. 基于macos的Homebrew常用命令和使用教程(你得看❤️)
  3. 保存GNOME桌面环境中声卡的音量设置
  4. python服务端对应多个客户端_Python-网络编程:TCP2 循环为多个客户端服务
  5. SAP建议客户将UI技术迁移到Fiori的六大原因
  6. python操作mysql数据库的常用方法使用详解
  7. Pa interface issue——PA_EXCEED_ROUND_LIMIT
  8. 【算法】图的基本介绍 以及 存储方式
  9. linux home目录重装,Linux/centos 卸载重装
  10. 一个站点存在多个web.config时如何管理?
  11. JS判断对象是不是数组“Array”
  12. VC6 ODBC 例子 之一
  13. python socket清空接受区_用 Python 开发一个 「聊天室」
  14. python使用正则验证电子邮件_在Python中使用正则表达式提取电子邮件地址
  15. 虎虎生威,挑战云上魔方(活动期完成可得实物魔方)
  16. 基于ASP的在线邮件收发系统研究设计
  17. Linux 修改环境变量设置的三种方式
  18. 正弦定理c语言,正弦定理练习题
  19. 广东电信最新DNS更新了
  20. oracle字符中不包含字母,oracle中字母A或B是否包含在字符串中

热门文章

  1. 知识点13--认识K8s
  2. 易路代理IP软件是什么?指纹防关联浏览器和Yilu代理是怎么配合工作的?
  3. 2023届双非计算机硕士算法岗秋招总结
  4. 正大国际中消协提新能源车四大消费投诉,涉及锁电、智能辅助和刹车等
  5. office在线编辑(java)原生完美体验,不需要重新适应新的编辑方式
  6. 基于Java+SpringBoot+Vue求职招聘系统设计与实现
  7. 有道云笔记不同步_有道云笔记笔记不能同步怎么办 有道云笔记无法同步解决教程...
  8. 【MYSQL基础(一)】——数据类型的详细解析. 数据库基本操作
  9. AI赋能的“元宇宙”时代,离我们还有多远?
  10. 《我的世界》Python编程入门(1)Minecraft(我的世界)Python编程环境搭建