题解:UVA10870 Recurrences
UVA10870 题解
题面
题意
考虑以下形式的递推函数:
f(n)=a1f(n−1)+a2f(n−2)+a3f(n−3)+⋯+adf(n−d)(当 n>d 时)
其中 a1,a2,⋯,ad 是任意常数。
- 递推的阶数 d(称为递推的阶数),
- d 个系数 a1,a2,⋯,ad,
- 初始值 f(1),f(2),⋯,f(d)。
输入将给定这些数字,以及两个整数 n 和 m。程序的任务是计算 f(n) 对 m 取模的结果。
思路
这题是裸的矩阵加速。(应该没有蓝吧……)
首先我们有如下式子。
- fi=a1×fi−1+a2×fi−2+⋯+ad×fi−d。
- fi−1=1×fi−1+0×fi−2+⋯+0×fi−d。
- fi−2=0×fi−1+1×fi−2+⋯+0×fi−d。
- ⋯
- fi−d+1=0×fi−1+0×fi−2+⋯+1×fi−d+1+0×fi−d。
把这些式子化成矩阵。
[fifi−1⋯fi−d+2fi−d+1]=[a1a2⋯ad−1ad10⋯0001⋯00⋯00⋯10]×[fi−1fi−2⋯fi−d+1fi−d]
于是要是 n⩽d 的话直接输出 fn,否则我们就可以用矩阵快速幂加速。
[fifn−1⋯fn−d+2fn−d+1]=[a1a2⋯ad−1ad10⋯0001⋯00⋯00⋯10]n−d×[fdfd−1⋯f2f1]
注意,在输入答案矩阵的时候是倒着输入的,不要搞错了。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
ll k,n,mod;
class matrix{
public:
ll g[25][25];
matrix(){for(int i=0; i<k; i++) for(int j=0; j<k; j++)g[i][j]=0;}
void clear(){for(int i=0; i<k; i++) for(int j=0; j<k; j++)g[i][j]=0;}
void print(){for(int i=0; i<k; i++){for(int j=0; j<k; j++)cout<<g[i][j]<<' ';cout<<endl;}}
matrix& operator = (const matrix& x){for(int i=0; i<k; i++) for(int j=0; j<k; j++) g[i][j]=x.g[i][j];return *this;}
matrix operator * (const matrix& x){matrix c;for(int i=0; i<k; i++) for(int j=0; j<k; j++) for(int l=0; l<k; l++) (c.g[i][j]+=g[i][l]*x.g[l][j]%mod)%=mod;return c;}
matrix operator ^ (const ll& x){matrix res,a=*this;ll b=x;for(int i=0; i<k; i++) res.g[i][i]=1;while(b){if(b&1)res=res*a;a=a*a;b>>=1;}return res;}
};
void write(ll n){if(n<0){putchar('-');write(-n);return;}if(n>9)write(n/10);putchar(n%10+'0');}
ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
int main(){
while(1){
k=read();n=read();mod=read();
if(!k&&!n&&!mod) return 0;
matrix f,ans;
for(int i=1; i<k; i++) f.g[i][i-1]=1;
for(int i=0; i<k; i++) f.g[0][i]=read();
for(int i=k-1; ~i; i--) ans.g[i][0]=read();
if(n<=k){write(ans.g[k-n][0]%mod);putchar('\n');continue;}
f=f^(n-k);ans=f*ans;
write(ans.g[0][0]);putchar('\n');
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!