P9510 『STA - R3』高维立方体

题目传送门
现在我们定义一个函数(注意在 n<1 时这个函数的值是 0):

f(n)=i=1nfib2(i)

需要求出:

i=1nfib(i)(f(i2)+fib2(i)+fib(i))

对于所有数据,1T2×1051n10182p109+7

很有意思的题

先对 fib2(i) 进行化简,裂项一下得:

fib2(i)=(fib(i+1)fib(i1))fib(i))=fib(i+1)fib(i)fib(i)fib(i1)

所以

f(n)=i=1nfib(i+1)fib(i)fib(i)fib(i1)=fib(n+1)fib(n)

f(i2) 代入原式得:

fib(i)(fib(i1)fib(i2)+fib2(i)+fib(i))=fib(i)(fib(i1)fib(i2)+fib(i+1)fib(i)fib(i)fib(i1))+fib2(i)=fib(i)[fib(i+1)fib(i)fib(i1)(fib(i)fib(i2))]+fib2(i)=fib(i+1)fib2(i)fib2(i)fib(i1)+fib2(i)

求和得:

fib(n+1)fib2(n)+fib(n+1)fib(n)

矩阵快速幂优化即可,注意卡常

#include<bits/stdc++.h>
#define LL long long
using namespace std;

const int M=2;

int T;
LL n,p;

struct matrix
{
	int row,col;
	LL data[M][M];

	matrix(int r,int c)
	{
		row=r;
		col=c;
		memset(data,0,sizeof(data));
	}
};

matrix a(2,2);
matrix ans(1,2);

matrix operator * (const matrix &x,const matrix &y)
{
	matrix c(x.row,y.col);
	for(int i=0; i<x.row; i++)
	{
		for(int j=0; j<y.col; j++)
		{
			for(int k=0; k<x.col; k++)
				c.data[i][j]+=x.data[i][k]*y.data[k][j];
			c.data[i][j]%=p;
		} 
	}
			
	return c;
}

void init()
{
	a.data[0][1]=a.data[1][0]=a.data[1][1]=ans.data[0][1]=1;
	a.data[0][0]=ans.data[0][0]=0;
}

int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld",&n,&p);
	
		init();
		
		for(; n; n>>=1)
		{
			if(n&1)
				ans=ans*a;
			a=a*a;
		}
	
		LL s=(ans.data[0][1]*ans.data[0][0]%p*ans.data[0][0]%p+ans.data[0][1]*ans.data[0][0]%p)%p;
		printf("%lld\n",s);
	}

	return 0;
}
posted @   xishanmeigao  阅读(7)  评论(0编辑  收藏  举报
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示