結果
| 問題 |
No.2524 Stripes
|
| コンテスト | |
| ユーザー |
MasKoaTS
|
| 提出日時 | 2023-09-27 23:50:40 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,411 bytes |
| コンパイル時間 | 3,518 ms |
| コンパイル使用メモリ | 246,504 KB |
| 最終ジャッジ日時 | 2025-02-17 02:43:45 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 4 WA * 21 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/convolution>
#define MOD 998244353ll
using namespace std;
using namespace atcoder;
using ll = long long;
struct Vector2 {
vector<ll> v1;
vector<ll> v2;
Vector2(void) {
}
Vector2(vector<ll> v1, vector<ll> v2) {
this->v1 = v1;
this->v2 = v2;
}
};
ll n;
vector<ll> operator*(const vector<ll>& left, const vector<ll>& right){
vector<ll> ret = convolution<MOD>(left, right);
while(ret.size() > n + 1){
ret.pop_back();
}
return ret;
}
vector<ll> operator+(const vector<ll>& left, const vector<ll>& right){
vector<ll> ret(max(left.size(), right.size()));
for(int i = 0; i < left.size(); ++i){
ret[i] += left[i];
}
for(int i = 0; i < right.size(); ++i){
ret[i] += right[i];
ret[i] %= MOD;
}
return ret;
}
struct Matrix22 {
vector<ll> v11, v12, v21, v22;
Matrix22(void) {
}
Matrix22(vector<ll> v11, vector<ll> v12, vector<ll> v21, vector<ll> v22) {
this->v11 = v11;
this->v12 = v12;
this->v21 = v21;
this->v22 = v22;
}
Matrix22 operator*(const Matrix22 other) const {
return Matrix22((this->v11 * other.v11) + (this->v12 * other.v21),
(this->v11 * other.v12) + (this->v12 * other.v22),
(this->v21 * other.v11) + (this->v22 * other.v21),
(this->v21 * other.v12) + (this->v22 * other.v22));
}
Vector2 operator*(const Vector2 other) const {
return Vector2((this->v11 * other.v1) + (this->v12 * other.v2),
(this->v21 * other.v1) + (this->v22 * other.v2));
}
};
int main(){
cin >> n;
string s; cin >> s;
vector<Matrix22> M(n, Matrix22());
for(int i = 0; i < n; ++i){
if(s[i] == 'R'){
M[i] = Matrix22({1}, {0, 1},
{0}, {1});
}
else{
M[i] = Matrix22({1}, {0},
{0, 1}, {1});
}
}
Vector2 v_init({1}, {1});
while(M.size() > 1){
vector<Matrix22> M_next = {};
for(int i = 0; i < M.size() - 1; i += 2){
M_next.push_back(M[i + 1] * M[i]);
}
M = M_next;
}
Vector2 v = M[0] * v_init;
vector<ll> ans = v.v1 + v.v2;
for(int i = 1; i < n + 1; ++i){
if(i >= ans.size()){
cout << 0 << endl;
continue;
}
cout << ans[i] << endl;
}
return 0;
}
MasKoaTS