WA求助
查看原帖
WA求助
220824
yyz1005楼主2022/4/8 13:29
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int m;
int a[510];
int rebase[510][510];
int ans[510];
int NumTurn(int x,int mo){
	if(x>mo) x%=mo;
	return x;
}
struct row{
	int s;
	int num[510];
	void RowInit(int val){
		memset(num,val,sizeof(num));
	}
	void RowOut(){
		for(int i = 1; i <= s; i++){
			printf("%d ",num[i]); 
		}
		puts("");
	} 
	row operator *(const row &b) const{
		row res;
		res.s = s;
		res.RowInit(0);
		for(int i = 1; i <= res.s; i++){
			for(int k = 1; k <= s; k++){
				res.num[i]+=(num[k]*b.num[NumTurn(i+k-1,res.s)]);
				res.num[i]%=m;
				//printf("%d %d\n",k,NumTurn(i+k-1,res.s));
			}
		}
		return res;
	}
};
row RowFastPow(row start,int k){
	if(k==1) return start;
	row t = RowFastPow(start,k>>1);
	t = t*t;
	if(k&1) return t*start;
	return t;
}

int NumberTrans(int x,int mo){
	if(x<=0) x = mo+x;
	return x;
}
int main(){
	//printf("Start Running\n");
	int n,d,k;
	while(scanf("%d%d%d%d",&n,&m,&d,&k) == 4){
		//printf("%d %d %d\n", n, d, k);
//		return 0;
		memset(a,0,sizeof(a));
		for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
		row base;
		base.s = n;
		base.RowInit(0);
		for(int i = 1; i <= n; i++){
			if((1<=i&&i<=1+d)||(n-d+1<=i&&i<=n)) base.num[i] = 1;
		}
		//base.RowOut();
		base = RowFastPow(base,k);
		//base.RowOut();
		memset(rebase,0,sizeof(rebase));
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= n; j++){
				rebase[i][j] = base.num[NumberTrans(j-i+1,n)];
			}
		}
		
		for(int i = 1; i <= n; i++){
			ans[i] = 0;
			for(int k = 1; k <= n; k++){
				ans[i]+=(rebase[k][i]*a[k]);
				ans[i]%=m;
			}
		}
		for(int i = 1; i <= n; i++){
			printf("%d ",ans[i]);
		}
		puts("");
	}
	return 0;
}
2022/4/8 13:29
加载中...