Luogu P哥的建军节比赛 T1___矩阵快速幂优化dp

127 篇文章 0 订阅
13 篇文章 0 订阅

#官方题解:
https://www.luogu.org/discuss/show/53017

#1.P哥破解密码
#题目大意:
M M M组数据,每组给出一个数 N N N,回答在长度为 N N N的字符串中,填充 A , B A,B A,B,使得不存在连续3个 A A A出现的字符串有多少个。

这里写图片描述
#分析:

f [ i , 0 ] f[i,0] f[i,0]表示长度为 i i i的合法字符串结尾的 A A A仅有 1 1 1个的个数。
f [ i , 1 ] f[i,1] f[i,1]表示长度为 i i i的合法字符串结尾为 B B B的个数。
f [ i , 2 ] f[i,2] f[i,2]表示长度为 i i i的合法字符串结尾的 A A A 2 2 2个的个数。
则有
f [ 1 , 0 ] = 1 , f [ 1 , 1 ] = 1 , f [ 1 , 2 ] = 0 f[1,0]=1,f[1,1]=1,f[1,2]=0 f[1,0]=1,f[1,1]=1,f[1,2]=0
可以推出转移方程:
f [ i , 0 ] = f [ i − 1 , 1 ] f[i,0]=f[i-1,1] f[i,0]=f[i1,1]
f [ i , 1 ] = f [ i − 1 , 0 ] + f [ i − 1 , 1 ] + f [ i − 1 , 2 ] f[i,1]=f[i-1,0]+f[i-1,1]+f[i-1,2] f[i,1]=f[i1,0]+f[i1,1]+f[i1,2]
f [ i , 2 ] = f [ i − 1 , 0 ] f[i,2]=f[i-1,0] f[i,2]=f[i1,0]
那么我们对这个东西可以利用矩阵乘法快速幂优化一下
#代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define mt(x) memset(x, 0 ,sizeof(x))
#define modn 19260817

using namespace std;

typedef long long ll;

ll a[3][3], f[3], n;

void Pre() 
{
	a[0][0] = 0, a[0][1] = 1, a[0][2] = 0;
	a[1][0] = 1, a[1][1] = 1, a[1][2] = 1;
	a[2][0] = 1, a[2][1] = 0, a[2][2] = 0;
	f[0] = 1, f[1] = 1, f[2] = 0;
}

void mul()
{
     ll c[3];
     mt(c);
     for (int i = 0; i < 3; i++)
          for (int k = 0; k < 3; k++)
               c[i] = (c[i] + f[k]*a[i][k]) % modn;
     memcpy(f, c, sizeof(c));
}

void mulself()
{
     ll c[3][3];
     mt(c);
     for (int i = 0; i < 3; i++)
          for (int j = 0; j < 3; j++)
               for (int k = 0; k < 3; k++)
                    c[i][j] = (c[i][j] + a[i][k]*a[k][j]) % modn;
     memcpy(a, c, sizeof(c));
}

int main()
{
	int T;
	scanf("%d", &T);
    while (T--) 
	{
        Pre();
        scanf("%lld", &n);
        if (n == 1) 
        {
        	printf("2\n");
        	continue;
		}
		n--;
		for (; n ; n >>= 1) 
        {
		     if (n & 1) mul();
             mulself();
		}
        printf("%lld\n", (f[0] + f[1] + f[2]) % modn);
    }
    return 0;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值