Skip to content

Commit 3096dad

Browse files
committed
SumSums from SPOJ
1 parent 748d0b6 commit 3096dad

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

SUMSUMS-h.cpp

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include<iostream>
2+
using namespace std;
3+
4+
#define mod 98765431
5+
int size=2;
6+
void multiply(long long int first[][3],long long int second[][3])
7+
{
8+
long long int answer[10][10]={};
9+
for(int i=0;i<size;i++){
10+
for(int j=0;j<size;j++){
11+
for(int k=0;k<size;k++){
12+
answer[i][j]=answer[i][j] + (first[i][k]%mod * second[k][j]%mod)%mod;
13+
answer[i][j]%=mod;
14+
}
15+
}
16+
}
17+
for(int i=0;i<size;i++){
18+
for(int j=0;j<size;j++){
19+
first[i][j]=answer[i][j];
20+
}
21+
}
22+
}
23+
24+
void power(long long int second[][3],long long int n){
25+
long long int current[3][3]={},i,j;
26+
for(i=0;i<size;i++){
27+
for(j=0;j<size;j++)
28+
current[i][j]=second[i][j];
29+
}
30+
if(n<=1){
31+
return;
32+
}
33+
if(n&1){
34+
power(second,n-1);
35+
multiply(second ,current);
36+
}
37+
else{
38+
power(second,n/2);
39+
multiply(second,second);
40+
}
41+
}
42+
int main(){
43+
int n,i;
44+
long long int t;
45+
long long int cows[50010],initial_sum=0;
46+
cin>>n>>t;
47+
for(int i=0;i<n;i++){
48+
cin>>cows[i];
49+
cows[i]%=mod;
50+
initial_sum+=cows[i];
51+
initial_sum%=mod;
52+
}
53+
long long int ans=0,myArray[3][3],newAnswer=0;
54+
myArray[0][0]=n-1;myArray[0][1]=0;myArray[1][0]=1;myArray[1][1]=-1;
55+
power(myArray,t);
56+
// for(int i=0;i<size;i++){
57+
// for(int j=0;j<size;j++)
58+
// cout<<myArray[i][j]<<" ";
59+
// cout<<"\n";
60+
// }
61+
for(i=0;i<n;i++){
62+
newAnswer=(myArray[1][0]%mod*initial_sum%mod)%mod + (myArray[1][1]%mod*cows[i]%mod)%mod;
63+
newAnswer=(newAnswer+mod)%mod;
64+
cout<<newAnswer<<"\n";
65+
}
66+
return 0;
67+
}

0 commit comments

Comments
 (0)