結果
問題 |
No.3202 Periodic Alternating Subsequence
|
ユーザー |
![]() |
提出日時 | 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; }