萌新求助#6 too short on line 1
查看原帖
萌新求助#6 too short on line 1
238408
vectorwyxSD省选加油楼主2021/6/28 10:20

RT,用的是矩阵快速幂优化递推,递推式是 f(i,j)=f(i1,j1)+f(i,j1)+f(i+1,j1)+f(i,j2)f_(i,j)=f_(i-1,j-1)+f_(i,j-1)+f_(i+1,j-1)+f(i,j-2)。其他点都过了,不知道为啥WA on #6,对拍也没拍出来QAQ

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define pb push_back
#define sml(x,y) (x=min(x,y))
#define big(x,y) (x=max(x,y))
#define ll long long
#define fo(i,x,y) for(register int i=x;i<=y;++i)
#define go(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,fh=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-') fh=-1; ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0'; ch=getchar();} return x*fh;}

const int N=105,qlr=30011;
struct Mat{
	int n,m;
	int a[N][N];
	Mat(){memset(a,0,sizeof a);} 
	void zero(){fo(i,1,n) fo(j,1,m) a[i][j]=0;n=m=0;} 
	Mat operator*(const Mat&x)const{
		Mat ret;ret.n=n,ret.m=x.m;
		fo(i,1,ret.n)
			fo(j,1,ret.m)
				fo(k,1,m) ret.a[i][j]=(ret.a[i][j]+a[i][k]*x.a[k][j])%qlr;
		return ret;
	}
}I,T,A,B;

Mat ksm(Mat &x,int y){
	if(y==1) return x;
	T=ksm(x,y/2);
	T=T*T;
	if(y&1) T=T*x;
	return T;
}

int main(){
	int n,m;cin>>n>>m;
	if(n>m){
		cout<<0;
		return 0;
	}
	if(m<=2){
		cout<<1;
		return 0;
	}
	A.n=B.n=B.m=2*n;A.m=A.a[n+1][1]=A.a[n+2][1]=1;
	fo(i,1,n) B.a[i][i+n]=1;
	fo(i,n+1,2*n) B.a[i][i-n]=B.a[i][i]=B.a[i][i-1]=B.a[i][i+1]=1;
	B.a[n+1][n]=0;
	B=ksm(B,m-2);
	A=B*A;
	cout<<A.a[2*n][1]; 
	return 0;
}
2021/6/28 10:20
加载中...