[UOJ UR#16]破坏发射台
来自FallDream的博客,未经允许,请勿转载,谢谢。
先考虑n是奇数的情况,很容易想到一个dp,f[i][0/1]表示转移到第i个数,第i个数是不是第一个数的方案数,然后用矩阵乘法优化一下就好了。
然后考虑n是偶数的情况,发现可以把圈分成两个半圆,dp就多了几维,需要表示两个数分别是是第一个数/第二个数/都不是的方案数。
#include<iostream>
#include<cstring>
#include<cstdio>
#define MN 10
#define mod 998244353
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct Matrix
{
int s[MN+][MN+];
Matrix(){memset(s,,sizeof(s));}
Matrix operator * (const Matrix&b)
{
Matrix c;
for(int i=;i<=MN;++i)
for(int j=;j<=MN;++j)
for(int k=;k<=MN;++k)
c.s[i][j]=(c.s[i][j]+1LL*s[i][k]*b.s[k][j])%mod;
return c;
}
}A,B;
int n,m; int Calc(int x,int y)
{
if(!x)
{
if(!y) return m-;
else return ;
}
if(x==)
{
if(y==) return m-;
else if(y==) return ;
else return ;
}
if(x==)
{
if(y==) return m-;
else if(y==) return ;
else return ;
}
} int main()
{
n=read();m=read();
if(m==) return *printf("%d\n",n==);
if(n&)
{
B.s[][]=;
A.s[][]=;
A.s[][]=m-;
A.s[][]=m-;
for(--n;n;n>>=,A=A*A) if(n&) B=A*B;
printf("%d\n",1LL*B.s[][]*m%mod);
}
else
{
if(n==&&m==) return *puts("");
if(m==) return *puts("");B.s[][]=;
for(int i=;i<;++i)
for(int j=;j<;++j) if(i!=j||i==)
for(int k=;k<;++k)
for(int l=;l<;++l) if(k!=l||k==)
{
A.s[k*+l][i*+j]=1LL*Calc(i,k)*Calc(j,l)%mod;
if(k==&&l==)
{
if(1LL*(m-)*(m-)+m--(i==)-(j==)<) A.s[k*+l][i*+j]=;
else (A.s[k*+l][i*+j]+=mod-(m--(i==)-(j==)))%=mod;
}
}
int ans=;
for(n>>=,--n;n;n>>=,A=A*A) if(n&) B=A*B;
for(int i=;i<;++i)
{
int j=i%,k=i/;
if(j==||k==) continue;
ans=(ans+B.s[i][])%mod;
}
printf("%d\n",1LL*ans*m%mod*(m-)%mod);
}
return ;
}
[UOJ UR#16]破坏发射台的更多相关文章
- UOJ 241. 【UR #16】破坏发射台 [矩阵乘法]
UOJ 241. [UR #16]破坏发射台 题意:长度为 n 的环,每个点染色,有 m 种颜色,要求相邻相对不能同色,求方案数.(定义两个点相对为去掉这两个点后环能被分成相同大小的两段) 只想到一个 ...
- 【UOJ#242】【UR#16】破坏蛋糕(计算几何)
[UOJ#242][UR#16]破坏蛋糕(计算几何) 题面 UOJ 题解 为了方便,我们假定最后一条直线是从上往下穿过来的,比如说把它当成坐标系的\(y\)轴. 于是我们可以处理出所有交点,然后把它们 ...
- uoj #242【UR #16】破坏蛋糕
uoj 考虑把那最后一条直线拎出来,并且旋转到和\(y\)轴平行(其他直线同时一起旋转),然后它和其他直线相交形成\(n+1\)个区间,现在要知道这些区间是否处在一个面积有限的区域 可以发现一段在有限 ...
- A. 【UR #16】破坏发射台
题解: 首先看n是偶数的 那么就是不需要满足对面这个性质的 这样就可以dp了 f[i][0/1]表示dp到第i位,当前数等于或不等于第一位的方案数 然后显然可以用矩阵优化 再考虑n为奇数 用一样的思路 ...
- [UOJ UR #4追击圣诞老人]
来自FallDream的博客,未经允许,请勿转载, 谢谢. 传送门 考虑直接维护一个堆,然后往里面丢链,并且取出k个堆顶就行了. 然后就需要分类讨论啥的,给你的三个点变成两条链,每次取出一条链之后选择 ...
- [UOJ UR #2]树上GCD
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 看完题目,一般人都能想到 容斥稳了 .这样我们只要统计有多少点对满足gcd是i的倍数. 考虑长链剖分,每次合并的时候,假设我已经求出轻 ...
- UOJ UR#9 App管理器
题目传送门 题目大意大概就是给你一个混合图(既有有向边又有无向边),对于每条无向边,u-v,问删去u->v,或删去v->u那条可以使新图强连通.(保证数据有解). 这道题前几个数据点送分. ...
- 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块
#33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...
- uoj #118. 【UR #8】赴京赶考 水题
#118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description ...
随机推荐
- 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)
标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...
- 《高级软件测试》JIRA使用手册(一)JIRA基本情况
JIRA 官方网站为:https://www.atlassian.com/software/jira 中文代理网站为:https://www.jira.cn 现版本:v7.3.0 Atlassian公 ...
- 05-移动端开发教程-CSS3兼容处理
CSS3的标准并没有全部定稿,目前CSS3的标准分成了不同的模块,具体的标准由各个模块推动标准和定稿,标准制定的过程中,浏览器也在不断的发新的版本来兼容新的标准.浏览器有时会给一些在试验阶段或非标准阶 ...
- php函数var_dump() 、print_r()、echo()
var_dump() 能打印出类型 print_r() 只能打出值 echo() 是正常输出... 需要精确调试的时候用 var_dump(); 一般查看的时候用 print_r() 另外 , ech ...
- Mego(05) - 创建模型
Mego框架使用一组约定来基于CLR类来构建模型.您可以指定其他配置来补充和/或覆盖通过约定发现的内容. 这里需要强调的我们EF不同的是框架只支持数据注释的语法来构建模型,后期只有通过其他接口才能更改 ...
- 泛型的 typeof
static void Main(string[] args) { TestTypeOf<string>(); Console.ReadKey(); } static void TestT ...
- Web Service的工作原理
Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...
- kubernetes 手绘画,先收藏一下
- GIT入门笔记(3)- git中的一些概念和原理
一.git管理过程中所处的4个阶段: 工作目录(workspace) 暂存区(index) 本地仓库(local repository) 远程仓库(remote repository) 二.工作目录+ ...
- apigw鉴权分析(1-5)亚马逊 - 鉴权分析
一.访问入口 https://developer.amazon.com/public/zh 二.鉴权方式分析 三.分解结论