【noip2016十连测round3】T3 涂色游戏 【矩阵快速幂优化dp】
涂色游戏
题解:
推一推公式。
我们让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】相关推荐
- 【NOIP2016提高组11.7】涂色游戏
题目大意 给你n行m列的网格,每个格子可以涂上一种颜色,一共有p种颜色,要求相邻两行的颜色总数不小于q.求方案数模998244353的结果. n≤100 m≤10910^9 q≤p≤100 分析 首先 ...
- 【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)
Problem C: [noip2016十连测第三场]序列 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 78 Solved: 32 [Submi ...
- 【NOIP 模拟赛】平均数 涂色游戏 序列题解
吐槽(完跪):神tmNOIP模拟赛,看到大题头根本高级数据结构什么的想都没想,结果死的很惨,第三题竟然要可持久化线段树,这NOIP我服了. 平均数: 这道题40分相信大家都能拿到,剩下的60分讲真考验 ...
- qduoj LC的涂色游戏(快速幂)
题目链接:https://qduoj.com/problem/12/点击打开链接 LC的涂色游戏 发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M ...
- c语言写一个格子涂色的游戏,不一样的涂色游戏小程序,这个魔力贴贴涂色游戏有点意思...
原标题:不一样的涂色游戏小程序,这个魔力贴贴涂色游戏有点意思 30000+游戏爱好者已加入我们! 沐沐带你发现好游戏! <魔力贴贴>游戏小程序好玩吗? <魔力贴贴>小游戏怎么玩 ...
- [CSP-S模拟测试]:涂色游戏(DP+组合数+矩阵快速幂)
题目描述 小$A$和小$B$在做游戏. 他们找到了一个$n$行$m$列呈网格状的画板.小$A$拿出了$p$支不同颜色的画笔,开始在上面涂色.看到小$A$涂好的画板,小$B$觉得颜色太单调了,于是把画板 ...
- NOI Online #2 提高组 第一题:涂色游戏
NOI Online #2 提高组 第一题:涂色游戏 前言 题目 解析 代码 前言 呦呵,这道题我竟然爆零了 而且我的暴力dfs死循环了!\bold{\Large\xcancel\text{而且我的暴 ...
- qduoj LC的涂色游戏
LC的涂色游戏 发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M 描述 LC是实验室传说级的大神,最近喜欢上了涂色游戏,现在纸上有n块空白区域,lc ...
- LYDSY模拟赛day3 涂色游戏
/* 非常好的题 */ #include <cstdio> #include <iostream> #include <cstdlib> #include < ...
最新文章
- mysql2005备份_创建完整数据库备份 - SQL Server | Microsoft Docs
- 基于macos的Homebrew常用命令和使用教程(你得看❤️)
- 保存GNOME桌面环境中声卡的音量设置
- python服务端对应多个客户端_Python-网络编程:TCP2 循环为多个客户端服务
- SAP建议客户将UI技术迁移到Fiori的六大原因
- python操作mysql数据库的常用方法使用详解
- Pa interface issue——PA_EXCEED_ROUND_LIMIT
- 【算法】图的基本介绍 以及 存储方式
- linux home目录重装,Linux/centos 卸载重装
- 一个站点存在多个web.config时如何管理?
- JS判断对象是不是数组“Array”
- VC6 ODBC 例子 之一
- python socket清空接受区_用 Python 开发一个 「聊天室」
- python使用正则验证电子邮件_在Python中使用正则表达式提取电子邮件地址
- 虎虎生威,挑战云上魔方(活动期完成可得实物魔方)
- 基于ASP的在线邮件收发系统研究设计
- Linux 修改环境变量设置的三种方式
- 正弦定理c语言,正弦定理练习题
- 广东电信最新DNS更新了
- oracle字符中不包含字母,oracle中字母A或B是否包含在字符串中
热门文章
- 知识点13--认识K8s
- 易路代理IP软件是什么?指纹防关联浏览器和Yilu代理是怎么配合工作的?
- 2023届双非计算机硕士算法岗秋招总结
- 正大国际中消协提新能源车四大消费投诉,涉及锁电、智能辅助和刹车等
- office在线编辑(java)原生完美体验,不需要重新适应新的编辑方式
- 基于Java+SpringBoot+Vue求职招聘系统设计与实现
- 有道云笔记不同步_有道云笔记笔记不能同步怎么办 有道云笔记无法同步解决教程...
- 【MYSQL基础(一)】——数据类型的详细解析. 数据库基本操作
- AI赋能的“元宇宙”时代,离我们还有多远?
- 《我的世界》Python编程入门(1)Minecraft(我的世界)Python编程环境搭建