首页 > 其他分享 >P4910 题解

P4910 题解

时间:2022-12-02 18:25:10浏览次数:64  
标签:int 题解 位填 ans mod include dp P4910

前言

题目传送门!

更好的阅读体验?

矩阵快速幂优化 DP 经典题。

题目简述

给定一个长度为 \(n\) 的环,每个位置可以填 \(1\) 或 \(2\)。相邻两个不能同时填 \(1\)。

求方案数。多测。

朴素 DP

思路

看到题目,很容易想到环形 DP。

设 \(dp_{i, 0}\) 表示第 \(i\) 位填 \(1\) 的总方案数,\(dp_{i, 1}\) 表示第 \(i\) 位填 \(2\) 的总方案数。

状态转移方程如下:

  • 第 \(i\) 位填 \(1\),则上一位只能填 \(2\)。所以 \(dp_{i, 0} = dp_{i - 1, 1}\)。
  • 第 \(i\) 位填 \(2\),则上一位可以填 \(1\) 或 \(2\)。所以 \(dp_{i, 1} = dp_{i - 1, 0} + dp_{i - 1, 1}\)。

初始化要分类讨论一下:

  • 如果第 \(1\) 位填 \(1\),则第 \(n\) 位只能填 \(2\)。所以答案算上 \(dp_{n, 1}\)。
  • 如果第 \(1\) 位填 \(2\),则第 \(n\) 位可以填 \(1\) 或 \(2\)。所以答案算上 \(dp_{n, 0} + dp_{n, 1}\)。

把公式抄上去即可。时间复杂度 \(O(n)\)。

代码

按照题目的应该是可以拿 \(60\) 分的。但是只有 \(48\) 分。

提交记录

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e6 + 5, mod = 1e9 + 7;
int n, dp[N][2]; //dp[i][0/1] : 第i位填A或B
void calc()
{
	for (int i = 2; i <= n; i++)
		dp[i][0] = dp[i - 1][1],                        //第i位填1,则上一位只能填2
		dp[i][1] = (dp[i - 1][0] + dp[i - 1][1]) % mod; //第i位填2,则上一位可以填1或2
}
void solve()
{
	long long ans = 0;
	scanf("%d", &n);

	dp[1][0] = 1, dp[1][1] = 0;           //第一位填1,
	calc(), ans = (ans + dp[n][1]) % mod; //则最后一位只能填2

	dp[1][0] = 0, dp[1][1] = 1;                      //第一位填2,
	calc(), ans = (ans + dp[n][0] + dp[n][1]) % mod; //则最后一位可以填1或2

	cout << ans << '\n';
}
int main()
{
	ios::sync_with_stdio(false);
	int T;
	scanf("%d", &T);
	while (T--) solve();
	return 0;
}

矩阵快速幂优化

思路

如果 \(n\) 就 \(10^6\),那顶多一道黄题。但是 \(n\) 是 \(10^{18}\),哭泣。

代码

很轻松拿到 \(100\) 分。跑得飞快,最慢的点 \(4\) 毫秒。

提交记录

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 2, mod = 1e9 + 7;
namespace martix {
	void mul(int ANS[][N], int x[][N], int y[][N])
	{
		int ans[N][N] = {};
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				for (int k = 0; k < N; k++)
					ans[i][j] = (ans[i][j] + 1ll * x[i][k] * y[k][j]) % mod;
		memcpy(ANS, ans, sizeof ans);
	}
	void ksm(int f[][N], int A[][N], long long y)
	{
		while (y)
		{
			if (y & 1) mul(f, f, A);
			mul(A, A, A);
			y >>= 1;
		}
	}
}; using namespace martix;

void solve()
{
	long long n, ans = 0;
	cin >> n;
	int zltAK[N][N] = {1, 0}; //第一位填1 的 初始矩阵
	int ioi[N][N] = {
		0, 1, 
		1, 1
	};
	ksm(zltAK, ioi, n - 1), ans = (ans + zltAK[0][1]) % mod; //则最后一位只能填2

	int hxyAK[N][N] = {0, 1}; //第一位填2 的 初始矩阵
	int csp[N][N] = {
		0, 1, 
		1, 1
	};
	ksm(hxyAK, csp, n - 1), ans = (ans + hxyAK[0][0] + hxyAK[0][1]) % mod; //则最后一位可以填1或2

	cout << ans << '\n';
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--) solve();
	return 0;
}

码字不易,希望能帮助到大家!

标签:int,题解,位填,ans,mod,include,dp,P4910
From: https://www.cnblogs.com/liangbowen/p/16945276.html

相关文章

  • 新生第三次练习题解
    bs来送签到啦简单思考下就知道无论选择何种路线从左上角到右下角,通过平移后就等价于先向下走到底再向右走到底,所以只要两个循环累加下两条边的的价值就能得到答案(注意循......
  • sql题解--求出平台同时在线最多的人数
    题目-求出平台同时在线最多的人数题目需求根据用户登录明细表(user_login_detail),求出平台同时在线最多的人数。结果如下:cn7需要用到的表:用户登录明细表:us......
  • BZOJ 4833 最小公倍佩尔数 题解 (数论,推式子)
    题目链接神奇数论题。做这题需要知道两个结论:对于满足\(f_{i+2}=a\cdotf_{i+1}+b\cdotf_{i}\),也就是形式类似斐波那契数列的序列,有\(gcd(f_i,f_j)=f_{gcd(i,j)}\)(据......
  • 高通 QXDM5 安装后 打不开 问题解决
    QXDM5安装完成后,打开时显示找不到Qt5WebKit.dll文件,网上找了Qt5WebKit.dll等dll导入QXDM5目录,照样是失败,打不开程序,最终找到的解决方案如下:1.先卸载已安装的QXDM5和 Q......
  • shiro低版本更新到高版本(>1.10.0)出现报错问题解决
    近期漏洞爆出(ApacheShiro<1.10.0身份认证绕过漏洞),开始升级新版的jar包。升级过程1.修改pom文件shiro版本<!--shiro--><dependency><groupId>org.apache.......
  • PUTTY 使用vi命令编辑文件的时候Backspace老出问题解决方案
    问题原因分析系统自带的vi命令存在这个问题,需要安装vim来解决问题安装vim编辑器删除vim-common模块apt-getremovevim-common安装vim模块apt-getinstallvim再使用vi命令,......
  • CF1550F 题解
    题意传送门数轴上顺次有\(n\)个点\(a_1<a_2<\cdots<a_n\)。有一只小青蛙,初始时在\(a_s\)处。小青蛙有两个参数:步长\(d\)和灵活程度\(k\)。其中,步长\(d\)......
  • 题解 CF1703G Good Key, Bad Key
    先放个代码。intn,k;cin>>n>>k;vector<vector<int>>a(n+5,vector<int>(35));for(inti=1;i<=n;i++){cin>>a[i][0];for(intj=1;j......
  • 网络搭建赛题解法
    网络搭建赛题解法准备工作1.所有云主机都要设置ip2.关闭防火墙和selinuxsetenforce0systemctlstopfirewall3.所有主机配置yum源mkdir/mnt/cdrommount/dev/cd......
  • ABC250简要题解
    重点在于简要A,B,C,语法题,跳了。D是埃筛求个质数枚举一下,跳了、E神秘的哈希。对于前\(i\)个数搞个可加哈希,这样能\(O(1)\)比较。给了个神秘的哈希方式是\(\suma......