HZNU-2793(矩阵快速幂)

构造出矩阵即可

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

using namespace std;
typedef long long ll;
const int mod = 193;
int n;
ll x;
int w[110], a[110];

struct Matrix{
	int m[110][110];

	void clear(){
		memset(m,0,sizeof(m));
		for(int i=0;i<=n-1;i++)
			m[i][i]=1;
	}
	
	void display(){
		cout<<"Matrix's begin:"<<endl;
		for(int i=0;i<=n-1;i++)
			for(int j=0;j<=n-1;j++)
				if(j<n-1) cout<<m[i][j]<<" ";
				else cout<<m[i][j]<<endl;
		cout<<"Matrix's end:"<<endl;
	}
	
	friend Matrix operator*(Matrix a,Matrix b){
		Matrix ans;
		for(int i=0;i<=n-1;i++)
			for(int j=0;j<=n-1;j++){
				ans.m[i][j]=0;
				for(int k=0;k<=n-1;k++){
					ans.m[i][j]+=a.m[i][k]*b.m[k][j];
					ans.m[i][j] %= mod;	
				}	
			}
		return ans;
	}
	
	friend Matrix operator^(Matrix base,ll k){
		Matrix ans;
		ans.clear();
		while(k){
			if(k&1) ans=ans*base;
			base=base*base;
			k>>=1;
		}
		return ans;
	}
	
};

void build(Matrix &base){
	memset(base.m,0,sizeof(base.m));
	for(int j = 0; j < n; ++ j){
		base.m[0][j] = a[j+1];
		base.m[j+1][j] = 1;
	}
}

int ans[110];
int main(){ 
	scanf("%d %lld", &n, &x);
	for(int i = 0; i < n; ++ i)	scanf("%d", &w[n-i]);
	for(int i = 0; i < n; ++ i)	scanf("%d", &a[i+1]);
	Matrix base;
	build(base);
	base = base ^ (x-n);
	int wx = 0;
	for(int i = 0; i < n; ++ i)
		wx += (base.m[0][i] * w[n-i]) % mod;
	printf("%d\n", wx % mod);
	return 0;
}
posted @ 2020-08-08 22:40  wansheking  阅读(99)  评论(0)    收藏  举报