1
#include<iostream>
2
using namespace std;
3
#define M 98765431
4
#define Max_N 50000
5
int N,T,sum=0;
6
int cows[Max_N];
7
int t[32];
8
__int64 a,b;
9
int D_to_B(int x)
10
{
11
int i=0;
12
while(x>=1){
13
t[i++]=x%2;
14
x/=2;}
15
return i;
16
}
17
void Multi(__int64 a[2][2],__int64 b[2][2])//矩阵a*b
18
{
19
__int64 c[2][2];
20
int i,j,h;
21
memset(c,0,sizeof(c));
22
for(i=0;i<2;i++)
23
for(j=0;j<2;j++)
24
for(h=0;h<2;h++){
25
c[i][j]+=M+a[i][h]*b[h][j];//防止c[i][j]<0的情况
26
c[i][j]%=M;}
27
for(i=0;i<2;i++)
28
for(j=0;j<2;j++)
29
a[i][j]=c[i][j];
30
}
31
void Multi_k(__int64 a[2][2],int x)//a^x
32
{
33
int k,i,j;
34
__int64 temp[2][2]={1,0,0,1};
35
k=D_to_B(x);//把x转为二进制
36
for(i=k-1;i>=0;i--){
37
Multi(temp,temp);
38
if(t[i]==1)Multi(temp,a);
39
}
40
for(i=0;i<2;i++)
41
for(j=0;j<2;j++)
42
a[i][j]=temp[i][j];
43
}
44
void compute_ab()
45
{
46
__int64 A[2][2]={N-1,0,1,-1};
47
if(T==1){a=0;b=1;return;}
48
Multi_k(A,T-2);//求bT-1的一步,A^T-2
49
b=(A[1][0]*(N-1)+A[1][1])%M;//这是bT-1,用来求aT的,aT=(N-1)*bT-1
50
a=((N-1)*b)%M;
51
b=(A[1][0]*(N-1)*(N-1)+A[1][1]*(N-2))%M;//利用bT-1求bT
52
}
53
void solve()
54
{
55
int i;
56
__int64 sum_i,result;
57
for(i=0;i<N;i++){
58
sum_i=(sum+M-cows[i])%M;//sum除了第i头牛
59
result=(b*sum_i+a*cows[i])%M;
60
printf("%I64d\n",result);}
61
}
62
int main()
63
{
64
/*freopen("1.in","r",stdin);
65
freopen("3.ans","w",stdout);*/
66
int i;
67
scanf("%d%d",&N,&T);
68
compute_ab();
69
for(i=0;i<N;i++){
70
scanf("%d",&cows[i]);
71
cows[i]%=M;
72
sum+=cows[i];
73
sum%=M;}
74
solve();
75
return 0;
76
}
77
posted on 2008-03-05 17:03
zoyi 阅读(211)
评论(0) 编辑 收藏 引用 所属分类:
acm