結果
| 問題 |
No.3202 Periodic Alternating Subsequence
|
| コンテスト | |
| ユーザー |
tau1235
|
| 提出日時 | 2025-07-11 23:06:35 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 95 ms / 2,000 ms |
| コード長 | 1,260 bytes |
| コンパイル時間 | 3,534 ms |
| コンパイル使用メモリ | 285,960 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-07-11 23:06:42 |
| 合計ジャッジ時間 | 6,369 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 24 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/modint>
using namespace std;
using ll=long long;
using mint=atcoder::modint1000000007;
struct S{
mint cnt;
mint s,s2;
S(ll cnt_=0,ll s_=0,ll s2_=0){
cnt=cnt_;
s=s_;
s2=s2_;
}
};
struct T{
vector<S> vec;
T(vector<S> vec_=vector<S>(4)){
vec=vec_;
}
};
S Smerge(S l,S r){
S ret;
ret.cnt=l.cnt*r.cnt;
ret.s=l.s*r.cnt+r.s*l.cnt;
ret.s2=l.s2*r.cnt + r.s2*l.cnt + 2*l.s*r.s;
return ret;
}
T merge(T l,T r){
T ret;
for (auto t:{l,r}){
for (int i=0;i<4;i++){
auto m=t.vec[i];
ret.vec[i].cnt+=m.cnt;
ret.vec[i].s+=m.s;
ret.vec[i].s2+=m.s2;
}
}
for (int i=0;i<4;i++) for (int j=0;j<4;j++){
if ((i&1)==(j&2)/2) continue;
int k=(i&2)+(j&1);
S m=Smerge(l.vec[i],r.vec[j]);
ret.vec[k].cnt+=m.cnt;
ret.vec[k].s+=m.s;
ret.vec[k].s2+=m.s2;
}
return ret;
}
int main(){
string t;
ll k;
cin>>t>>k;
int n=t.size();
T tt;
for (int i=0;i<n;i++){
T t2;
int j=0;
if (t[i]=='1') j=3;
t2.vec[j]=S{1,1,1};
tt=merge(tt,t2);
}
T tt2;
while (k>0){
if (k%2==1) tt2=merge(tt2,tt);
tt=merge(tt,tt);
k/=2;
}
mint ans=0;
for (int i=0;i<4;i++) ans+=tt2.vec[i].s2;
cout<<ans.val()<<endl;
}
tau1235