Submission #1771064
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, 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 | 100 |
Code Size | 2557 Byte |
Status | AC |
Exec Time | 53 ms |
Memory | 512 KB |
Judge Result
Set Name | All | ||
---|---|---|---|
Score / Max Score | 100 / 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 | AC | 1 ms | 256 KB |
random_02.txt | AC | 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 | AC | 1 ms | 256 KB |
random_07.txt | AC | 3 ms | 256 KB |
random_08.txt | AC | 8 ms | 256 KB |
random_09.txt | AC | 52 ms | 512 KB |
random_10.txt | AC | 53 ms | 512 KB |
random_11.txt | AC | 53 ms | 512 KB |
random_12.txt | AC | 53 ms | 512 KB |
random_13.txt | AC | 53 ms | 512 KB |
random_14.txt | AC | 53 ms | 512 KB |
random_15.txt | AC | 49 ms | 512 KB |
sample_1.txt | AC | 1 ms | 256 KB |
sample_2.txt | AC | 1 ms | 256 KB |
sample_3.txt | AC | 3 ms | 256 KB |
small_1.txt | AC | 1 ms | 256 KB |
small_2.txt | AC | 1 ms | 256 KB |