一次元
N個のセルを含む一次元セルオートマトンを考えます。0からN-1の番号のセル。
セル当たりのAは、M個の状態よりも小さな非負の整数として表現されます。細胞の急激な変化の状態は、各整数倍で発生します。
我々は、S(I、T)が時刻T細胞におけるI番目の状態を示している定義します。時刻t + 1状態はS(I、T + 1)のように表される =(A×S(I-1、T)+ B×S(I、T)+ C×S(I + 1、t)は)MOD M、
A、B、Cが負でない整数与えられています。I <0またはN≤iために、我々は、S(I、T)= 0を定義します 。
初期状態0の時に定義されたオートマトンとセルを考えると、各タスクの状態があなたのセル計算時間Tです。入力
データの複数のセットを含むテスト入力。各データの最初の行は、6つの整数N、M、A、B、含有 C、Tを
時刻0の状態で連続セル当たりN M整数小さな非負に含まれる第2行。6の終わりとしてゼロを入力します。出力
各試験のために、出力に各二つの隣接する数字間のMのN整数小さな非負は、スペースで区切られ、各セルの状態は、時間Tを表します。
サンプル入力
5 4 1 3 2 0
0 1 2 0 1
5 7 1 3 2 1
0 1 2 0 1
5 13 1 3 2 11
0 1 2 0 1
5 2 0 1 100
0 1 2 0 1
6 6 0 2 3 1000
0 1 2 0 1 4
20〜1000 0 2 3 1000000000
0 1 2 0 1 0 1 2 0 1 0 1 2 0 1 0 1 2 0 1
30 2 1 0 1 1000000000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
30 2 1 1 1 1000000000
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
30 5 2 3 1 1000000000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0サンプル出力
0 1 2 0 1
2 0 0 4 3
2 12 10 9 11
3 0 4 2 1
0 4 2 0 4 4
0 376 752 0 376 0 376 752 0 376 0 376 752 0 376 0 376 752 0 376
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 3 2 2 2 3 3 4 1 3 1 2 3 0 4 3 3 4 0 2 2 2 2 1 1 2 1 3 0
アイデア:
単純マトリクス高速電力
\ [\右] ^ T \ {行列} B&C&0を開始&\ cdots&0 \\ A&B&C&\ cdots&0 \\ 0&A&B&\ cdots&0 \\ \ vdots&\ vdots&\ vdots&\ ddots&0 \\ 0 0 0&\ cdots&B \\ \端{行列} \ [左\ [\ {行列} X_1 \\ X_2 \\ X_3 \\\ vdots \\ x_nに関する\端{行列}開始\右] \左
\(\ mathfrak {話し\は\ \ \コードをお見せし、\安いです。} \)
#include<map>
#include<cstdio>
#include<queue>
#include<bitset>
#include<vector>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
# define Type template<typename T>
# define read read1<int>()
Type inline T read1()
{
T t=0;
char k;
bool fl=0;
do k=getchar(),(k=='-')&&(fl=1);while('0'>k||k>'9');
while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
return fl?-t:t;
}
struct re{Type re operator >> (T &a){a=read1<T>();return *this;}}re;
# define fre(k) freopen(k".in","r",stdin);freopen(k".ans","w",stdout)
# define ll int
class Mat
{
# define Vec vector<ll>
# define Arr vector<Vec>
Arr a;
public:
Mat(){}
Mat(Arr k):a(k){}
Mat(ll x,ll y){a.resize(x);for(ll i=0;i<x;++i)a[i].resize(y);for(int i=0;i<x;++i)for(int j=0;j<y;++j)a[i][j]=0;}
Vec& operator [](const ll k){return a[k];}
ll wide(){return a.size();}
ll len(){return a.empty()?0:a[0].size();}
Mat operator *(Mat k)
{
Arr tem;
tem.resize(wide());
for(ll i=0;i<wide();++i)
{
tem[i].resize(k.len());
for(ll j=0;j<len();++j)
for(ll l=0;l<k.len();++l)
tem[i][l]+=a[i][j]*k[j][l];
}
return Mat(tem);
}
Mat operator +(Mat k)
{
ll o=max(wide(),k.wide()),p=max(len(),k.len());
Mat tem(o,p);
for(ll i=0;i<o;++i)
for(ll j=0;j<p;++j)
{
if(i<wide()&&j<len())tem[i][j]=a[i][j];
if(i<k.wide()&&j<k.len())tem[i][j]+=k[i][j];
}
return tem;
}
Mat operator %(ll k)
{
Mat tem(wide(),len());
for(ll i=0;i<wide();++i)
for(ll j=0;j<len();++j)
tem[i][j]=a[i][j]%k;
return tem;
}
Mat& operator %=(ll k){return *this=*this%k;}
Mat& operator *=(Mat k){return *this=*this*k;}
Mat& operator +=(Mat k){return *this=*this+k;}
bool scan(ll x,ll y,const ll value)
{
if(x>=wide()||y>=len()||x<0||y<0)return 0;
a[x][y]=value;
return 1;
}
# undef Vec
# undef Arr
};
Type T quickpow(T k,const ll n,ll Mod)
{
if(n==1)return k;
T tem=quickpow(k,n>>1,Mod);
if(Mod!=0)
{
tem=(tem*tem)%Mod;
if(n&1)tem=(tem*k)%Mod;
}
else
{
tem*=tem;
if(n&1)tem*=k;
}
return tem;
}
int main(){
for(int n,m,A,B,C,T;n=read,m=read,A=read,B=read,C=read,T=read,n|m|A|B|C|T;){
Mat x(n,n),y(n,1);A%=m;B%=m;C%=m;
for(int i=0;i<n;++i)
y[i][0]=read;
for(int i=0;i<n;++i){
x[i][i]=B;
if(i)x[i][i-1]=A;
if(i+1<n)x[i][i+1]=C;
}
if(T)y=quickpow(x,T,m)*y%m;
for(int i=0;i<n;++i)
printf("%d ",y[i][0]);
putchar('\n');
}
return 0;
}