/* 這是一個典型的二分矩陣的問題,我弄了好久才弄出來,而且參考了2個人的代碼;
我不知為何,我一開始構造的矩陣總是得不出正確的答案。
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
1
1
1
1
1
1
1
1
1
0
9
8
7
6
5
4
3
2
1
0
這兩個矩陣的乘積,在加一個單位矩陣,就通過了。
9 8 7 6 5 4 3 2 1 0
a0 1 1 1 1 1 1 1 1 1 1
a1
a2
a3
a4
a5
a6
a7
a8
a9
昨天想的是10 * 10 10*10
今天覺得好像1*10 10*10
的就可以了試下看,這道這個哪裡出錯了!!改成下面的就OK了,同時利用單位矩陣
a0 1
a1 1
a2 1
a3 1
a4 1
a5 1
a6 1
a7 1
a8 1
a9
感謝zhc給了靈感 也同時感謝網上給我錯誤修正的網址,同時感謝師傅,給我找出了最初的錯誤
*/
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int MAX=10;
int mod;
struct Mat
{
int df[MAX][MAX];
}init, unit;
Mat Mul(Mat a,Mat b)
{
int i, j, k;
Mat c;
for(i = 0; i < MAX; i++)
for(j = 0; j < MAX; j++)
{
c.df[i][j] = 0;
for(k = 0; k < MAX; k++)
c.df[i][j] += a.df[i][k] * b.df[k][j];
if(c.df[i][j] >= mod)
c.df[i][j] %= mod;
}
return c;
}
Mat cal(int t)
{
Mat p, q;
p = init;
q = unit;
while(t != 1)
{
if(t&1)
{
p = Mul(p, q);
t--;
}
else
{
q = Mul(q, q);
t >>= 1;
}
}
p = Mul(p, q);
return p;
}
int main()
{
int i, j, k, sum;
Mat tt;
while(scanf("%d%d", &k, &mod) != EOF)
{
//memset(unit,0,sizeof(unit));
memset(unit.df,0,sizeof(unit.df));
memset(init.df,0,sizeof(init.df));
for(i = 0; i < MAX; i++)
{
scanf("%d",&unit.df[0][i]);
init.df[i][i] = 1;
if(i < MAX - 1)
unit.df[i+1][i] = 1;
}
k -= 9;
tt = cal(k);
sum = 0;
for(i = 0; i < MAX ; i++)
sum += tt.df[0][i]*(9 - i) % mod;
printf("%d/n", sum % mod);
}
return 0;
}
/*
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int MAX=10;
int mod;
struct Mat
{
long long int df[MAX][MAX];
}init, unit;
Mat Mul(Mat a,Mat b)
{
int i, j, k;
Mat c;
for(i = 0; i < MAX; i++)
for(j = 0; j < MAX; j++)
{
c.df[i][j] = 0;
for(k = 0; k < MAX; k++)
c.df[i][j] += a.df[i][k] * b.df[k][j];
if(c.df[i][j] >= mod)
c.df[i][j] %= mod;
}
return c;
}
Mat cal(int t)
{
Mat p, q;
p = init;
q = unit;
while(t != 1)
{
if(t&1)
{
p = Mul(p, q);
t--;
}
else
{
q = Mul(q, q);
t >>= 1;
}
}
p = Mul(p, q);
return p;
}
int main()
{
int i, j, k, sum;
Mat tt;
while(scanf("%d%d", &k, &mod) != EOF)
{
//memset(unit,0,sizeof(unit));
memset(unit.df,0,sizeof(unit.df));
memset(init.df,0,sizeof(init.df));
for(i = 0; i < MAX; i++)
{
scanf("%d",&unit.df[i][0]);
init.df[i][i] = 1;
//if(i != 0)
//unit.df[0][i] = 1;(這裡想錯了,矩陣構造好的話,要去試下的)
if(i < 9)
unit.df[i][i+1] = 1;
}
k -= 9;
tt = cal(k);
sum = 0;
for(i = 0; i < MAX ; i++)
sum += tt.df[i][0]*(9 - i) % mod;
printf("%d/n", sum % mod);
}
return 0;
}