SP8547 题解
SP8547 题解
题意简述:给定
分析:
对于这种题,一看就是猜结论的题,因为欧几里得算法最后的结束态即为:
不妨设这个二元组为序列
容易发现:
问题变成了快速求解斐波那契数列,矩阵快速幂即可。
这里注意特判:也即当
#define int long long
const long long p=1000000007;
int f[2],a[2][2],ans[2][2],lst[2];
void mul(int a[2][2],int b[2][2]){
int c[2][2];
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
c[i][j]=0;
for(int k=0;k<2;k++){
c[i][j]+=a[i][k]*b[k][j];
if(c[i][j]>p)c[i][j]%=p;
}
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
a[i][j]=c[i][j];
}
void power(int a[2][2],int b){
ans[0][0]=ans[1][1]=1;
while(b){
if(b&1)mul(ans,a);
b>>=1;
mul(a,a);
}
}
signed main(){
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n==1){
cout<<"2"<<endl;
continue;
}
if(n==0){
cout<<"0"<<endl;
continue;
}
memset(a,0,sizeof a);
memset(f,0,sizeof f);
memset(ans,0,sizeof ans);
memset(lst,0,sizeof lst);
a[0][1]=1;
a[1][1]=a[1][0]=1;
power(a,n);
f[0]=f[1]=1;
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
lst[j]+=f[k]*ans[k][j];
if(lst[j]>p)lst[j]%=p;
}
}
cout<<(lst[0]+lst[1])%p<<endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!