社区讨论

所以怎么改初值?求救。。

P1962斐波那契数列参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6y7br7
此快照首次捕获于
2025/11/20 12:45
4 个月前
此快照最后确认于
2025/11/20 12:45
4 个月前
查看原帖
怎么把f[1]和f[2]的初值改掉
CPP
#include<bits/stdc++.h>
#define ll long long
#define REP(i,a,b) for (int i(a);i<=(b);++i)
const int MOD=1e9+7;
using namespace std;
struct node{
	long long m[3][3];
}amap,MO;
ll n;
node chen(node a,node b){
	node c;
	REP(i,1,2)REP(j,1,2){
		c.m[i][j]=0; REP(z,1,2)
		c.m[i][j]+=(a.m[i][z]%MOD)*(b.m[z][j]%MOD)%MOD;
		c.m[i][j]%=MOD;
	}
	return c;
}
node work(ll x){
	node ans=MO; x--; 
	while (x){
		if (x%2==1) ans=chen(ans,MO);
		MO=chen(MO,MO);
		x/=2;
	}
	return ans;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin>>n;
	MO.m[1][2]=MO.m[2][1]=MO.m[2][2]=1; MO.m[1][1]=0;
	if (n<=2) cout<<"1"<<endl;
	else {
	amap=work(n-2);
	cout<<(amap.m[1][2]+amap.m[2][2])%MOD<<endl;
		}
}

回复

1 条回复,欢迎继续交流。

正在加载回复...