[HDU] Fibonacci Check-up

这是链接

结论破题,浪费了我三张纸,结论居然只和斐波那契数列有关,有趣
推导过程太多不写了qwq,虽然推导很简单,但是有个坑点,很难想到将 $ S_i $ 最终化为 $ F_i $ 表示。
结论是 $$ S_i = F_{n*2} $$
所以这道题我们只需要求斐波那契数就行了,是不是很简单啊qwq。


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
typedef long long ll;
const int N = 5;

ll Mod;

struct matrix{
	ll M[N][N];
	int l,r;
	
	void operator * (matrix x){
		int i,j,k; matrix t;
		for(i=1;i<=l;i++)
			for(j=1;j<=r;j++)
				t.M[i][j]=0;
		for(i=1;i<=r;i++)
			for(j=1;j<=x.l;j++)
				for(k=1;k<=l;k++)
					t.M[j][i] = (t.M[j][i] + M[k][i] * x.M[j][k]) %  Mod;
		for(i=1;i<=l;i++)
			for(j=1;j<=r;j++)
				M[i][j]=t.M[i][j];
	}
}res,a,c,ans;

int main(){
	int i,j,T,cnt;ll n;
	res.l=2; res.r=1;
	a.l=a.r=2;
	a.M[1][1]=a.M[1][2]=a.M[2][1]=1; a.M[2][2]=0;
	res.M[1][1]=1; res.M[1][2]=0;
	scanf("%d",&T);
	while(T--){
		scanf("%lld%lld",&n,&Mod);
		if(n==0){
			printf("0\n");
			continue;
		}
		ans=res;
		c=a; 
		n*=2; n-=1;
		for(; n ; n >>= 1){
			if(n & 1) ans * c;
			c * c;
		}
		printf("%lld\n",ans.M[1][1]);
	}
	return 0;
}

posted @ 2017-12-09 17:03  FranceDisco  阅读(104)  评论(0编辑  收藏  举报