社区讨论

20分求解qwq

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi6urhji
此快照首次捕获于
2025/11/20 11:09
4 个月前
此快照最后确认于
2025/11/20 11:09
4 个月前
查看原帖
明明下载的数据过了呀,,为什么会wa啊QAQ
CPP
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <queue>
#define maxn 3
#define mo 1000000007
using namespace std;

long long n;

struct matrix
{ 
    long long m[maxn][maxn];
    void clear()
    {
    	for(int i=1;i<maxn;++i)
    	for(int j=1;j<maxn;++j)
    	    m[i][j]=0;
	}
}a,b,e;

long long read()
{
	long long xx=0,kk=1;char p='-';
	while(!isdigit(p)){p=getchar();if(p=='-')kk=-1;}
	while(isdigit(p)){xx=xx*10+p-'0';p=getchar();}
	return kk*xx;
}

matrix mul(matrix a,matrix b)
{
	matrix c;c.clear();
	for(int i=1;i<maxn;++i)
	for(int j=1;j<maxn;++j)
	for(int k=1;k<maxn;++k)
	    c.m[i][j]=(c.m[i][j]+((a.m[i][k]%mo)*(b.m[k][j]%mo))%mo)%mo;
	return c;
}

matrix poww(matrix a,long long b)
{
	matrix base=a,ans=e;
	while(b)
	{
		if(b&1)ans=mul(base,ans);
		base=mul(base,base);
		b>>=1;
	}
	return ans;
}

int main()
{
	n=read();
	a.clear();b.clear();e.clear();
	a.m[1][1]=a.m[1][2]=1;
	b.m[1][1]=b.m[1][2]=b.m[2][1]=1;
	e.m[1][1]=e.m[2][2]=1;
    matrix ans=mul(poww(b,n-1),a);
    printf("%lld\n",ans.m[1][1]);
    return 0;
}

回复

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

正在加载回复...