博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「SNOI2019」
阅读量:6230 次
发布时间:2019-06-21

本文共 1224 字,大约阅读时间需要 4 分钟。

#4379. 「SNOI2019」纸牌

题目:

有一副纸牌。牌一共有 $n$ 种,分别标有 $1, 2, \dots , n$,每种有 $C$ 张。故这副牌共有 $nC$ 张。

三张连号的牌($i, i+1, i+2$)或三张相同的牌 $(i,i,i)$ 可以组成一叠。如果一组牌可以分成若干(包括零)叠,就称其为一组王牌。

你从牌堆中摸了一些初始牌。现在你想再挑出一些牌组成一组王牌,请问有多少种可能组成的王牌呢?答案对 $998244353$ 取模。

两组牌相同当且仅当它们含有的每一种牌数量都相同。

思路:

看到数据范围 $n\le 1e^{18}$ 大概猜到对于没有初始牌的牌堆要么有显然规律,要么就是矩乘。

对然后就矩乘了。

因为大于等于 $3$ 张的,我们可以在自己牌堆里自己凑成一组,对于要和其他种牌配对的只需要留至多比前一堆多三张的情况。

所以我们可以用一个 $3*3​$ 的状态表示最后两个牌堆的情况。

然后用矩阵表示状态的转移系数。

对于有初始牌的单独构造矩阵。

代码:

#include
#define il inline#define LL long long#define _(d) while(d(isdigit(ch=getchar())))using namespace std;const int N=1005,p=998244353;int c,m,a[N],Lg;LL k[N],n;il LL read(){ LL x,f=1;char ch; _(!)ch=='-'?f=-1:f;x=ch^48; _()x=(x<<1)+(x<<3)+(ch^48); return f*x;}il int mu(int x,int y){ return (x+y>=p)?x+y-p:x+y;}struct Mat{ int a[11][11]; Mat friend operator *(Mat t1,Mat t2){ Mat t3; for(int i=0;i<9;i++)for(int j=0;j<9;j++)t3.a[i][j]=0; for(int i=0;i<9;i++)for(int j=0;j<9;j++)for(int k=0;k<9;k++) t3.a[i][j]=mu(t3.a[i][j],1ll*t1.a[i][k]*t2.a[k][j]%p); return t3; }}Ans,po[70],tmp;il void ksm(LL y){ for(int i=0;i<=Lg;i++)if((1ll<
View Code

 

转载于:https://www.cnblogs.com/Jessie-/p/11015092.html

你可能感兴趣的文章
方面和服务,差别大吗?
查看>>
Infor喜获中国智能制造与电商物流大奖
查看>>
瑞士科学家研发飞行夹克,用户可以像鸟一样任意飞翔
查看>>
互金启示录:流量思维的末路
查看>>
「镁客·请讲」镁伽机器人黄瑜清:有需求没供给,协作机器人市场存在“两极现象”...
查看>>
GoPro 研发无人机意欲如何?
查看>>
Ubuntu 16.04清楚Dash历史记录
查看>>
随机生成数的方法
查看>>
Oracle APEX 系列文章5:在阿里云上打造属于你自己的APEX完整开发环境 (进一步优化)...
查看>>
大型分布式C++框架《二:大包处理过程》
查看>>
携手科技出版巨擎 推动中国IT人才成长 51CTO与人民邮电出版社达成战略合作
查看>>
11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump
查看>>
WCF序列化
查看>>
uCos-III移植到STM32F10x
查看>>
Centos下源码包安装lamp常见的几个小问题
查看>>
angularjs-过滤输入filter
查看>>
angularjs-过滤输入filter
查看>>
RAC 环境下的重要参数
查看>>
你知道,人工智能如何增强数据中心的安全性
查看>>
苗圩:从国家战略高度加快推进智能网联汽车发展
查看>>