dtoj3226荒芜废墟(ruins)
荒芜废墟(ruins)
Ori来到了荒芜废墟,荒芜废墟可以看成一条数轴。Ori一开始在 ,每一次可以往右跳 的步。但有些位置设置了激光,这些位置Ori是无法到达的,一共有 种激光,每一种激光有一个特征值 表示这种激光会出现在 以及 的倍数的位置上。Ori想要知道从 走到 有多少种走法。
对于100%的数据, , ,保证ti,k可以写成 的形式,其中
Sol
n是1e9,我们考虑矩乘来转移。
注意到
也就是说ti和k的lcm最多3125,记为T
前k步的转移是有限制的,不能从转i<0转,需要特殊处理
处理完我们就T步T步的转移,每T步的转移都是相同的。
最后一段也暴力转移即可。
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #define ll long long #define mod 1000000007 using namespace std; int n,m,k,t[4],T; ll f[55],F[8005],a[8500][55]; struct node{ ll v[52][52]; }p,ans; node ch(node a,node b){ node c; for(int i=0;i<k;i++) for(int j=0;j<k;j++){ c.v[i][j]=0; for(int x=0;x<k;x++){ c.v[i][j]=(c.v[i][j]+a.v[i][x]*b.v[x][j]%mod)%mod; } } return c; } int main(){ cin>>n>>m>>k;T=k; for(int i=1;i<=m;i++){ scanf("%d",&t[i]); T=T*t[i]/__gcd(T,t[i]); } f[0]=1;a[0][0]=1; for(int i=1;i<=k-1;i++){ a[i][i]=1; for(int j=i-1;j>=0;j--){ f[i]=(f[i]+f[j])%mod; } for(int x=1;x<=m;x++)if(i%t[x]==0)f[i]=0; } for(int i=k;i<T+k;i++){ for(int j=i-1;j>=i-k;j--){ int fl=0;for(int x=1;x<=m;x++)if(j%t[x]==0)fl=1; if(fl&&j)continue; for(int x=0;x<k;x++){ a[i][x]=(a[i][x]+a[j][x])%mod; } } for(int j=1;j<=m;j++){ if(i%t[j]==0)for(int x=0;x<k;x++)a[i][x]=0; } } for(int i=T;i<T+k;i++){ for(int j=0;j<k;j++)p.v[j][i-T]=a[i][j]; ans.v[i-T][i-T]=1; } int num=n/T;n%=T; while(num){ if(num&1)ans=ch(ans,p); p=ch(p,p);num>>=1; } for(int i=0;i<k;i++){ for(int j=0;j<k;j++){ F[i]=(F[i]+ans.v[j][i]*f[j]%mod)%mod; } } for(int i=k;i<=n;i++){ for(int j=i-1;j>=i-k;j--){ F[i]=(F[i]+F[j])%mod; } for(int x=1;x<=m;x++)if(i%t[x]==0)F[i]=0; } cout<<F[n]<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2019-02-17 [NOI2014]动物园
2019-02-17 最大异或和(xor)
2019-02-17 排序