【动态规划】【矩阵快速幂优化】【XR-1】分块
【XR-1】分块
题目描述
有一个长度为
PinkRabbit 要求他只准将序列分成
NaCly_Fish 要求他只准将序列分成
同一个人可能会要求 xht37 多次相同的块长。
xht37 想同时满足 PinkRabbit 和 NaCly_Fish 要求,只好使用两个人都允许的长度分块。
xht37 想知道,有多少种不同的分块方案,答案对
解法探究
用桶可以得到两个人都要求的块长值,设其为
由于
考虑原矩阵是一个1*100的矩阵,最前面的a[1]代表dp[now],a[2] = dp[now - 1],a[3] = dp[now - 2]....
这是由于我们进行dp时需要前面最多100位的信息
对于第一列,即
对于第2100列,原封不动地取原来矩阵的第199项,所以在Matrix[i][i + 1] = 1(i
(截自洛谷题解区,所以是竖着的)
通过本题,应再次加深矩阵快速幂优化的印象,结合lxw巨的题目分书 luogu U281338进行理解,搞懂“乘一次前进一步”的过程
Code
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7,N = 105,M = 100;
typedef long long ll;
int st[N],a[N],pr,nf,tp = 0,maxL = 0,res[N];
ll n;
struct Matrix{
int p[N][N];
};
Matrix operator *(Matrix x,Matrix y)
{
Matrix z;
memset(z.p,0,sizeof(z.p));
for(int i = 1;i <= M;i++)
for(int j = 1;j <= M;j++)
for(int k = 1;k <= M;k++)
z.p[i][j] = (z.p[i][j] + 1ll * x.p[i][k] * y.p[k][j] % MOD) % MOD;
return z;
}
inline Matrix ksm(Matrix base,ll pts)
{
Matrix ret = base;
pts--;
for(;pts > 0;pts >>= 1,base = base * base)
if(pts & 1)
ret = ret * base;
return ret;
}
int main()
{
cin>>n;
int x;
cin>>pr;
for(int i = 1;i <= pr;i++)
{
cin>>x;
st[x] = 1;
}
cin>>nf;
for(int i = 1;i <= nf;i++)
{
cin>>x;
if(st[x] == 1)
a[++tp] = x;
}
Matrix mul;
memset(mul.p,0,sizeof(mul.p));
for(int i = 1;i <= tp;i++) mul.p[a[i]][1] = 1;
for(int i = 1;i <= M;i++) mul.p[i][i + 1] = 1;
memset(st,0,sizeof(st));
st[1] = 1;
mul = ksm(mul,n);
for(int i = 1;i <= 1;i++)
for(int j = 1;j <= M;j++)
for(int k = 1;k <= M;k++)
res[j] += 1ll * st[k] * mul.p[k][j] % MOD,res[j] %= MOD;
cout<<res[1];
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话