有没有大佬help
  • 板块学术版
  • 楼主Glass_S
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/15 14:40
  • 上次更新2023/11/15 15:40:28
查看原帖
有没有大佬help
1011275
Glass_S楼主2023/11/15 14:40

这是题目

涉及矩阵加速递推

我第一个点就TLE了,求调

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define int long long
using namespace std;
int s,p,n;
void wr(int x)
{
	if(x<0)
	    x=-x,putchar('-');
	if(x>9)
	    wr(x/10);
	putchar(x%10+'0');
}
struct matrix
{
    int num[3][3]={};//矩阵 
}c,e;
matrix operator *(const matrix a,const matrix b)//矩阵乘法
{
	matrix ans={};
	for(int i=1;i<=2;i++)
	    for(int j=1;j<=2;j++)
	        for(int k=1;k<=2;k++)
	            ans.num[i][j]+=a.num[i][k]*b.num[k][j];
	return ans;
}
matrix ksm(matrix a,int k)
{
	matrix ans={};
	for(int i=1;i<=2;i++)
	    ans.num[i][i]=1;
	for(;k;k>>=1,a=a*a)
	    if(k&1)
	        ans=ans*a;
	return ans;
}
signed main()
{
    while(scanf("%lld%lld%lld",&s,&p,&n)==3)
	{
        e.num[1][1]=0,e.num[2][1]=1,e.num[1][2]=-p,e.num[2][2]=s;
    	c.num[1][1]=s,c.num[1][2]=s*s-2*p;
    	c=c*ksm(e,n-1);
    	wr(c.num[1][1]);
       putchar('\n');
    }
    return 0;
}
2023/11/15 14:40
加载中...