solution-cf821e
CF821E题解
posted on 2022-08-26 08:51:54 | under 题解 | source
你在
在
平面上有
要求你一直在线段的下方且在
问:到达
我们设
按照题意,递推式:
那么,我们可以构造一个形如
对于矩阵快速幂,这是一种优化递推的算法,可以用
首先,定义矩阵乘法:
对于一个
然后,因为矩阵乘法满足结合律,所以我们有了矩阵快速幂。矩阵快速幂的话就是把快速幂的板子套在矩阵上而已。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int n,k,a,b,c;
struct M{
int a[20][20];
M operator*(M t){
M res;
for(int i=0;i<=15;i++)for(int j=0;j<=15;j++)res.a[i][j]=0;
for(int i=0;i<=15;i++){
for(int j=0;j<=15;j++){
for(int k=0;k<=15;k++){
res.a[i][j]=(res.a[i][j]+a[i][k]*t.a[k][j]%mod)%mod;
}
}
}
return res;
}
M operator^(int k){
M res,_=*this;
for(int i=0;i<=15;i++)for(int j=0;j<=15;j++)res.a[i][j]=(i==j);
while(k){
if(k&1)res=res*_;
_=_*_;
k>>=1;
}
return res;
}
}ans,base;
signed main()
{
scanf("%lld%lld",&n,&k);
for(int j=0;j<=15;j++)for(int k=0;k<=15;k++)ans.a[j][k]=0;
ans.a[0][0]=1;
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&a,&b,&c);
if(b>=k)b=k;
for(int j=0;j<=15;j++)for(int l=0;l<=15;l++)base.a[j][l]=0;
for(int j=0;j<=c;j++){
base.a[j][j]=1;
if(j<c)base.a[j][j+1]=1;
if(j)base.a[j][j-1]=1;
}
ans=(base^(b-a))*ans;
if(b>=k)break;
}
printf("%lld",ans.a[0][0]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】