首页 > 其他分享 >P2203 Blink 题解

P2203 Blink 题解

时间:2023-08-10 19:15:33浏览次数:36  
标签:ch int 题解 矩阵 cdots Blink P2203 右灯 vdots

好像并没有矩阵快速幂的题解,那我来写一篇

题目分析

对于每两盏灯,只考虑右灯变化,分为四种情况:

左灯为 \(1\),右灯为 \(1\),右灯变为 \(0\);

左灯为 \(0\),右灯为 \(0\),右灯不变,为 \(0\);

左灯为 \(1\),右灯为 \(0\),右灯变为 \(1\);

左灯为 \(0\),右灯为 \(1\),右灯不变,为 \(1\);

设第 \(i\) 盏灯状态为 \(s[i]\)。

不难发现:

\[s[i] = s[i-1] \oplus s[i] \]


可以构造如下 \(N\times N\) 递推矩阵,用于进行递推:

\(\begin{bmatrix} 1 & 1 & 0 & \cdots & 0 & 0 & 0\\ 0 & 1 & 1 & \cdots & 0 & 0 & 0\\ 0 & 0 & 1 & \cdots & 0 & 0 & 0\\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots &\\ 0 & 0 & 0 & \cdots & 1 & 1 & 0\\ 0 & 0 & 0 & \cdots & 0 & 1 & 1\\ 1 & 0 & 0 & \cdots & 0 & 0 & 1\\ \end{bmatrix}\)

(灯环形排列,需要头尾相接)


举个例子,当 \(N=5\) 时,矩阵即为:

\(\begin{bmatrix} 1 & 1 & 0 & 0 & 0\\ 0 & 1 & 1 & 0 & 0\\ 0 & 0 & 1 & 1 & 0\\ 0 & 0 & 0 & 1 & 1\\ 1 & 0 & 0 & 0 & 1\\ \end{bmatrix}\)

递推矩阵推出来后,直接矩阵快速幂即可。


朴实无华的代码

#include<bits/stdc++.h>
using namespace std;
#define int long long//十年OI一场空,不开long long见祖宗
inline int read(){int x=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}return x;}
const int N=20;
const int p=2;
int n,m;
int s[N];
struct MS
{
	int c[N][N];
	int n,m;
};
MS operator *(const MS &a,const MS &b)//矩阵乘法
{
	MS c;
	c.n=a.n;
	c.m=b.m;
	for(int i=1;i<=a.n;i++)
		for(int j=1;j<=b.m;j++)
			c.c[i][j]=0;
	for(int i=1;i<=a.n;i++)
		for(int j=1;j<=b.m;j++)
			for(int k=1;k<=a.m;k++)
				c.c[i][j]=(c.c[i][j]+a.c[i][k]*b.c[k][j]%p)%p;
	return c;
}
MS fpow(MS a,int k)//矩阵快速幂
{
	MS e;
	e.n=n;
	e.m=m;
	for(int i=1;i<=n;i++) e.c[i][1]=s[n-i+1];
	while(k>0)
	{
		if(k&1) e=a*e;
		a=a*a;
		k>>=1;
	}
	return e;
}
MS init()//递推矩阵构造
{
	MS a;
	a.n=n;
	a.m=n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a.c[i][j]=0;
	for(int i=1;i<=n;i++)
	{
		a.c[i][i]=1;
		a.c[i][i+1]=1;
	}
	a.c[n][1]=1;//头尾相接
	return a;
}
MS a;
signed main()
{
	int k;
	m=1;
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++) s[i]=read();
	a=init();
	MS ans=fpow(a,k);
	for(int i=n;i>=1;i--)
	printf("%lld\n",ans.c[i][1]);
	return 0;
}

标签:ch,int,题解,矩阵,cdots,Blink,P2203,右灯,vdots
From: https://www.cnblogs.com/MooSheng/p/17621272.html

相关文章

  • P9342 Bitaro's Travel 题解
    模拟赛做到的题,赛后看了Y2hlbnlpa2Fp的题解,感觉没讲清楚,这里做下补充,提供自己的理解。基本思路:对每个\(A_i\)的答案进行预处理,对于每个询问,只需要找到第一个到达的景点即可。那么如何预处理每个点的答案呢?有一条很重要的性质:最多转向\(\log{X}\)次。要证明这个结论,先放......
  • P6879 スタンプラリー 3 题解
    思路前几篇题解都介绍了,这里着重介绍一个状态设计的小技巧。在设计状态时,我们可能会碰到状态数值过大,而dp数组内存的值较小的情况。例如在该题用\(dp_{l,r,t,0/1}\)表示逆时针经过\(l\)个,顺时针经过\(r\)个,已经花费\(t\)秒,所拿到的雕像个数,\(0\)表示当前在左端点,\(1\)......
  • AT_apc001_g Colorful Doors 题解
    模拟赛做到的题,场上写贪心爆栈了qwq首先在首尾加上两个\(1\)表示进出,将两段路中间的间隔作为传送门,恰好有\(2\timesN\)个传送门,根据两段路的经过情况给传送门分类别:00:用\(N\)表示,称为无用点,不到达该点。10:用\(S\)表示,称为起点,需要通过向右走走到一次。01:用\(T\)......
  • 关于Promise的超难面试题解读
    让我来看一下题目,如下所示Promise.resolve().then(()=>{ console.log(0); returnPromise.resolve(4); }).then((res)=>{ console.log(res); }); Promise.resolve().then(()=>{ console.log(1); }).then(()=>{ console.log(2); }).t......
  • 题解 [SDOI2009] Elaxia的路线
    题目链接题意简述:求两条给定起点终点最短路的最长公共路径。首先最长公共路径一定是两条最短路的公共最长链的部分。至少一定在两条最短路上。考虑如何求出一条路径是否包含于一条最短路,只要路径\(x\rightarrowy\)满足:\[dis_{st\rightarrowx}+w_{x\rightarrowy}+dis_{y\r......
  • keepalived 邮件通知无法发送邮件问题解决【亲测有效,没有效果来找我】
    环境keepalivedkeepalived-2.2.7操作系统cenos7安装方式源码编译安装问题最近在安装keepalived高可用服务,环境是安装完了,但是我想要使用邮件通知这个功能,通过网上捞针怎么也不成功,真是绝绝子,折磨我1天多。终于在刚刚得到了解决办法解决在vrrp_instance自定义的名字中添加......
  • iPhone上使用Charles 抓包的配置方法与问题解决方式
    我是在Macos下配置的,其它平台的内容和步骤也差不多。配置方法:(网上很多,大致说下)一、Charles下载:1)官网下载地址:https://www.charlesproxy.com/download/  二、Charles配置代理:1)查看本机IP:help-->LocalIPAddress   2)查看或者设置访问端口:Proxy->ProxySettings三、配置ios手......
  • P9511 『STA - R3』大豆 题解--zhengjun
    妙妙题。题意给定\(F_0(x)=a_{(x-1)\bmodn+1}\)。\[F_k(x)=F_{k-1}(x)-\sum\limits_{i=2}^nF_k(\lfloor\frac{n}{i}\rfloor)\]求\(F_k(m)\)。\(1\len\le10^4,1\lem\le10^{10},1\lek\le3\)。直接数论分块求解的复杂度是\(O(m^{\frac{3}{4}}k)\),难以通过。如果像......
  • 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC的pytorch源码编译报错——
     如题:pytorch源码编译报错——USE_CUDA=OFF  在编译pytorch源码的时候发现错误,虽然编译环境中已经安装好CUDA和cudnn,环境变量也都设置好,但是编译好的pytorch包wheel总是在运行torch.cuda.is_available()显示false,于是从编译源码的过程中进行重新检查,发现在编译的过程中提......
  • 8 月 9 日测试题解
    集体被大样例薄纱了。T1P1292有两个容量分别为\(a\)与\(b\)的酒杯与一个容量无限的酒桶,有以下几种操作:用酒桶将\(a\)倒满;将\(b\)中的酒全部倒入酒桶;将\(b\)中的酒倒入\(a\),直到\(a\)被装满或\(b\)被倒空。问\(a\)中可能倒出的最少的酒是多少以及分别至......