\(大意是用数组a里的数字,组成一个序列,使得序列和为n的方案种数\)传送门

\(先考虑dp.\)

\(但是不能直接用背包转移,因为是序列,要考虑顺序。\)

\(所以,为了去重,我们令dp[i][j]为凑成i最后用的a[j]的方案数\)

dp[0]=1;//把第二维优化掉
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(i>=a[j])
dp[i]+=dp[i-a[j]];

\(接下来考虑用矩阵加速。\)

\(设a数组中最大的数是size,那么dp[i]最多从dp[i-size]转移过来,所以矩阵大小是size*size\)

现在我们想用

\[\left[
\begin{matrix}
dp_{size-1}\\
dp_{size-2}\\
dp_{size-3}\\
....\\
1\\
0\\
\end{matrix}
\right]
得到
\left[
\begin{matrix}
dp_{size}\\
dp_{size-1}\\
dp_{size-2}\\
....\\
1\\
0\\
\end{matrix}
\right]
\]

那我们的构造矩阵是怎样的呢?

\(第一行因为dp[i]可以从每一个i-a[j]得到,所以所有mat[1][a[j]]=1;\)

\(其余行,只需要把mat[i][i-1]设置成1即可(下面的构造矩阵省略了第一行,因为是根据具体数据填写)\)

\[\left[
\begin{matrix}
dp_{size-1}\\
dp_{size-2}\\
dp_{size-3}\\
....\\
1\\
0\\
\end{matrix}
\right]
*
\left[
\begin{matrix}
0&1&0&0&...&0\\
0&0&1&0&...&0\\
0&0&0&1&...&0\\
0&0&0&0&...&1\\
\end{matrix}
\right]
=
\left[
\begin{matrix}
dp_{size}\\
dp_{size-1}\\
dp_{size-2}\\
....\\
1\\
0\\
\end{matrix}
\right]
\]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,pr,x,nf,a[109],dp[109],size,b[109],c[109];
struct rce{
ll m[102][102];
rce(){memset(m,0,sizeof(m));}
};
rce operator * (rce a,rce b)
{
rce c;
for(int i=1;i<=size;i++)
for(int j=1;j<=size;j++)
{
c.m[i][j]=0;
for(int k=1;k<=size;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
}
return c;
}
rce quickpow(rce a,ll n)
{
rce ans;
for(int i=1;i<=size;i++)
for(int j=1;j<=size;j++)
if(i==j) ans.m[i][j]=1;
else ans.m[i][j]=0;
while(n)
{
if(n&1) ans=ans*a;
a=a*a;
n>>=1;
}
return ans;
}
int main()
{
cin>>n;
cin>>pr;
for(int i=1;i<=pr;i++)
{
cin>>x;
a[x]=1;
}
cin>>nf;
for(int i=1;i<=nf;i++)
{
cin>>x;
c[x]=1;
}
for(ll i=1;i<=100;i++)
{
if(a[i]&&c[i])
{
b[++b[0]]=i;
size=max(size,i);
}
}
dp[0]=1;
for(int i=1;i<=size;i++)
for(int j=1;j<=b[0];j++)
{
if(i>=b[j])
dp[i]=(dp[i]+dp[i-b[j]])%mod;
}
rce zao,init;
for(int i=1;i<=size;i++) init.m[i][1]=dp[size-i];
for(int i=1;i<=b[0];i++) zao.m[1][b[i]]=1;
for(int i=2;i<=size;i++) zao.m[i][i-1]=1;
zao=quickpow(zao,n-size+1)*init;
cout<<zao.m[1][1]%mod;
}

P5343 【XR-1】分块(dp矩阵加速)的更多相关文章

  1. HDU 5564 Clarke and digits 状压dp+矩阵加速

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[ ...

  2. Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks dp+矩阵加速

    题目链接: http://codeforces.com/problemset/problem/621/E E. Wet Shark and Blocks time limit per test2 se ...

  3. bzoj 4037: [HAOI2015]数字串拆分【dp+矩阵加速】

    首先f长得就很像能矩阵优化的,先构造转移矩阵(这里有一点神奇的地方,我看网上的blog和我构造的矩阵完全不一样还以为我的构造能力又丧失了,后来惊奇的发现我把那篇blog里的构造矩阵部分换成我的构造方式 ...

  4. bzoj 1009 DP+矩阵加速

    我们用DP来解决这个问题 W[I,J]表示准考证的第I位,和不吉利的数匹配到了第J位的方案数,这个状态的表示也可以看成 当前到第I位了,准考证的后J位是不吉利的数的前J位,的方案数 那么我们最后的an ...

  5. bzoj2004公交线路——DP+矩阵加速递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...

  6. [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...

  7. 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)

    洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...

  8. [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)

    题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...

  9. Codeforces 691E Xor-sequences(矩阵加速DP)

    题目链接 Xor-sequences 利用矩阵加速. 先预处理出当序列长度为$2$的时候的方案数. 也就是说这个序列起点是$a[i]$终点是$a[j]$且中间没有任何元素. 但是所求的$k$很大,序列 ...

随机推荐

  1. 数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序

    优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉 ...

  2. 如何正确管理HBase的连接,从原理到实战

    本文将介绍HBase的客户端连接实现,并说明如何正确管理HBase的连接. 最近在搭建一个HBase的可视化管理平台,搭建完成后发现不管什么查询都很慢,甚至于使用api去listTable都要好几秒. ...

  3. MyEclipse 10安装SVN插件subclipse

    1. 下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?expandFolder=2240& ...

  4. Android应用架构分析

    一.res目录: 1.属性:Android必需: 2.作用:存放Android项目的各种资源文件.这些资源会自动生成R.java. 2.1.layout:存放界面布局文件. 2.2.strings.x ...

  5. 全平台阅读器 StartReader

    前段时间在网上闲逛, 发现了一款全平台阅读器 StartReader, 用了一阵子感觉还不错,网址是: https://www.startreader.com/ 感觉这款阅读器是程序员的福音,it人员 ...

  6. Spring Cloud 系列之 Gateway 服务网关(三)

    本篇文章为系列文章,未读第一集的同学请猛戳这里: Spring Cloud 系列之 Gateway 服务网关(一) Spring Cloud 系列之 Gateway 服务网关(二) 本篇文章讲解 Ga ...

  7. 4. js

    1.) ~   操作符 console.log(~-2)  // 1 console.log(~-1)  // 0 console.log(~0)  // -1 console.log(~1)  // ...

  8. Linux网络编程(2)

    Preview 基于上一篇博客,本文将继续展开TCP面向连接的,客户端以及服务端各自需要进行的操作,我们按照真实TCP连接的顺序,分别阐述客户端socket(), connect()以及服务端sock ...

  9. Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用

    1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...

  10. 2019-2020-1 20199308《Linux内核原理与分析》第九周作业

    <Linux内核分析> 第八章 可执行程序工作原理进程的切换和系统的一般执行过程 8.1 知识点 进程调度的时机 ntel定义的中断类型主要有以下几种 硬中断(Interrupt) 软中断 ...