[JZOJ4870]涂色游戏
来源:互联网 发布:许继电气怎么样知乎 编辑:程序博客网 时间:2024/06/10 05:26
题目大意
给定一个
计算方案数,答案对
题目分析
不要被神秘的模数吓到了。
条件只是限制了相邻两列,因此考虑单独考虑两列的合法方案数。
可以发现,如果在某一列之前的都是合法方案,我们在计算这一列时只不需要关注每个位置具体涂了什么颜色,只需要关心前一列填了多少种颜色,后一列填了多少种颜色,又有多少种颜色是两列都出现的。
设
令
那么我们有
怎么求这个
其中
这样的计算是
怎么优化呢?显然可以使用矩阵乘法优化
代码实现
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int P=998244353;const int N=105;struct matrix{ int num[N][N]; int r,c;}f,one,zero;matrix operator*(matrix a,matrix b){ matrix ret; memset(ret.num,0,sizeof ret.num); ret.r=a.r,ret.c=b.c; for (int i=0;i<ret.r;i++) for (int j=0;j<ret.c;j++) for (int k=0;k<a.c;k++) (ret.num[i][j]+=1ll*a.num[i][k]*b.num[k][j]%P)%=P; return ret;}matrix operator^(matrix x,int y){ matrix ret=zero; for (;y;y>>=1,x=x*x) if (y&1) ret=ret*x; return ret;}int C[N][N],h[N][N],fact[N];int n,m,p,q,ans;void calc(){ fact[0]=1; for (int i=1;i<=p;i++) fact[i]=1ll*fact[i-1]*i%P; C[0][0]=1; for (int i=1;i<=p;i++) { C[i][0]=1; for (int j=1;j<=i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%P; } h[0][0]=1; for (int i=1;i<=n;i++) for (int j=1;j<=i;j++) h[i][j]=(1ll*h[i-1][j]*j%P+h[i-1][j-1])%P; one.r=one.c=n; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int k=max(i+j-p,0);k<=i&&k<=j&&k<=i+j-q;k++) (one.num[i-1][j-1]+=1ll*C[i][k]*C[p-i][j-k]%P*h[n][j]%P*fact[j]%P)%=P; zero.r=zero.c=n; for (int i=0;i<n;i++) zero.num[i][i]=1; f.r=1,f.c=n; for (int i=1;i<=n&&i<=p;i++) f.num[0][i-1]=1ll*C[p][i]*h[n][i]%P*fact[i]%P; f=f*(one^(m-1)); ans=0; for (int i=1;i<=n;i++) (ans+=f.num[0][i-1])%=P;}int main(){ freopen("color.in","r",stdin),freopen("color.out","w",stdout); scanf("%d%d%d%d",&n,&m,&p,&q); calc(); printf("%d\n",ans); fclose(stdin),fclose(stdout); return 0;}
0 0
- [JZOJ4870]涂色游戏
- JZOJ4870. 涂色游戏
- 【jzoj4870】【涂色游戏】【动态规划】【矩阵快速幂】
- JZOJ4870. 【NOIP2016提高A组集训第9场11.7】涂色游戏
- 涂色游戏
- hdu 4559 涂色游戏
- shu_1572 涂色游戏
- qduoj LC的涂色游戏
- 博弈——涂色游戏
- 【NOIP2016提高组11.7】涂色游戏
- 【NOIP 模拟赛】平均数 涂色游戏 序列题解
- qduoj LC的涂色游戏(快速幂)
- 2013金山西山居创意游戏程序挑战赛——复赛(1) 涂色游戏
- 【NOIP2016提高A组集训第9场11.7】涂色游戏
- 格子涂色
- 涂色问题
- 墙壁涂色
- 涂色问题
- MBR+BIOS与GPT+UEFI启动系统的区别
- Understanding LSTM Networks
- oracle group by 字段合并
- 更新雅克 git新工程后
- 心灵鸡汤(一)
- [JZOJ4870]涂色游戏
- 两步实现安卓手机秒变网络摄像头
- Unable to resolve target 'android-XX'问题
- matlab 图像分割 hough 霍夫变换
- 前端面试题(市场上流传最广的)
- 设置 IDEA 中的 Tab 键为 4 个空格
- Pure JS (3.1):上传下载(利用 HTML5 与 Flash)
- SQL防御
- JDK版本的新特性