| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1335729 | mamabear | Lego Wall (EGOI22_legowall) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MOD = 1000000007;
long long power(long long base, long long exp) {
long long res = 1;
base %= MOD;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
vector<long long> berlekamp_massey(const vector<long long>& s) {
vector<long long> C = {1}, B = {1};
int L = 0;
long long m = 1;
for (int i = 0; i < s.size(); i++) {
long long d = 0;
for (int j = 0; j <= L; j++) {
d = (d + C[j] * s[i - j]) % MOD;
}
if (d == 0) {
B.insert(B.begin(), 0);
continue;
}
vector<long long> temp = C;
long long c = (d * power(m, MOD - 2)) % MOD;
while (C.size() <= B.size() + 1) C.push_back(0);
for (int j = 0; j < B.size(); j++) {
C[j + 1] = (C[j + 1] - c * B[j]) % MOD;
if (C[j + 1] < 0) C[j + 1] += MOD;
}
if (2 * L <= i) {
L = i + 1 - L;
B = temp;
m = d;
} else {
B.insert(B.begin(), 0);
}
}
return C;
}