Submission #1771061
Source Code Expand
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <limits>
#include <random>
#include <complex>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <iomanip>
using namespace std;
#define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define RREP(i,n) for(int (i)=(int)(n)-1;i>=0;i--)
#define REMOVE(Itr,n) (Itr).erase(remove((Itr).begin(),(Itr).end(),n),(Itr).end())
typedef long long ll;
template <class T> struct SquareMatrix {
vector < vector < T > > mat;
SquareMatrix (int n) : mat(n, vector < T > (n, 0)) {}
vector < T > & operator [] (int n) {
return mat[n];
}
int size() {
return (int) mat.size();
}
void operator = (SquareMatrix A) {
for (int i = 0; i < mat.size(); i++)
for (int j = 0; j < mat.size(); j++)
this -> mat[i][j] = A[i][j];
}
};
template <class Matrix> Matrix operator + (Matrix &A, Matrix &B) {
Matrix ret(A.size());
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < A.size(); j++)
ret[i][j] = A[i][j] + B[i][j];
return ret;
}
template <class Matrix, class Vector> Vector operator * (Matrix &M, Vector &V) {
Vector ret(V.size(), 0);
if (M.size() != V.size()) return {-1};
for (int i = 0; i < M.size(); i++)
for (int j = 0; j < M.size(); j++)
ret[i] += M[i][j] * V[j];
return ret;
}
template <class Matrix> Matrix operator * (Matrix &A, Matrix &B) {
Matrix ret(A.size());
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < A.size(); j++)
for (int k = 0; k < A.size(); k++)
ret[i][j] += A[i][k] * B[k][j];
return ret;
}
void pow_mod_matrix(SquareMatrix <long long > &M, long long k) {
SquareMatrix < long long > A = M;
k--;
while (k > 0) {
if (k & 1) M = (M * A);
A = A * A;
k >>= 1;
}
}
int main() {
ll N,M; cin >> N >> M;
vector < long long > A(N),C(N);
REP(i,N) cin >> A[i];
REP(i,N) cin >> C[i];
SquareMatrix < long long > Mat(N);
REP(i,N) Mat[0][i] = C[i];
REP(i,N - 1) REP(j,N) {
if (i == j) Mat[i + 1][j] = -1LL;
else Mat[i + 1][j] = 0;
}
if (M <= N) {
cout << A[M - 1] << endl;
return 0;
}
M -= N;
pow_mod_matrix(Mat, M);
reverse(A.begin(), A.end());
vector < long long > ans = Mat * A;
cout << ans[0] << endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
D - 漸化式 |
User |
kosakkun |
Language |
C++14 (GCC 5.4.1) |
Score |
0 |
Code Size |
2802 Byte |
Status |
WA |
Exec Time |
53 ms |
Memory |
512 KB |
Judge Result
Set Name |
All |
Score / Max Score |
0 / 100 |
Status |
|
Set Name |
Test Cases |
All |
random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, sample_1.txt, sample_2.txt, sample_3.txt, small_1.txt, small_2.txt |
Case Name |
Status |
Exec Time |
Memory |
random_01.txt |
WA |
1 ms |
256 KB |
random_02.txt |
WA |
1 ms |
256 KB |
random_03.txt |
AC |
1 ms |
256 KB |
random_04.txt |
AC |
1 ms |
256 KB |
random_05.txt |
AC |
1 ms |
256 KB |
random_06.txt |
WA |
1 ms |
256 KB |
random_07.txt |
WA |
3 ms |
256 KB |
random_08.txt |
WA |
8 ms |
256 KB |
random_09.txt |
WA |
52 ms |
512 KB |
random_10.txt |
WA |
53 ms |
512 KB |
random_11.txt |
WA |
53 ms |
512 KB |
random_12.txt |
WA |
53 ms |
512 KB |
random_13.txt |
WA |
53 ms |
512 KB |
random_14.txt |
WA |
53 ms |
512 KB |
random_15.txt |
WA |
48 ms |
512 KB |
sample_1.txt |
WA |
1 ms |
256 KB |
sample_2.txt |
WA |
1 ms |
256 KB |
sample_3.txt |
WA |
3 ms |
256 KB |
small_1.txt |
WA |
1 ms |
256 KB |
small_2.txt |
WA |
1 ms |
256 KB |