結果
問題 |
No.510 二次漸化式
|
ユーザー |
![]() |
提出日時 | 2025-02-20 22:11:43 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 113 ms / 3,000 ms |
コード長 | 3,294 bytes |
コンパイル時間 | 1,871 ms |
コンパイル使用メモリ | 197,904 KB |
実行使用メモリ | 35,720 KB |
最終ジャッジ日時 | 2025-02-20 22:11:50 |
合計ジャッジ時間 | 6,785 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 34 |
ソースコード
#include<bits/stdc++.h> #define ll long long using namespace std; #define fi first #define sc second #define pii pair<int,int> #define pdd pair<double,double> #define pb push_back #define umap unordered_map #define mset multiset #define pq priority_queue #define ull unsigned long long #define i128 __int128 #define ld long double #define fixs fixed<<setprecision const int maxn=1e5+10; const int mod=1e9+7; struct Mat{ int n,a[5][5]; void init(int N){ n=N; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) a[i][j]=0; } } void getI(){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) a[i][j]=(i==j); } } Mat operator *(Mat x){ Mat res; res.init(n); for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) res.a[i][j]=(res.a[i][j]+1ll*a[i][k]*x.a[k][j])%mod; } } return res; } Mat operator ^(int y){ Mat res,x=(*this); res.init(n),res.getI(); for(int i=y;i;i>>=1){ if(i&1) res=(res*x); x=(x*x); } return res; } void output(){ cout<<"----MATRIX----"<<endl; for(int i=1;i<=n;i++,cout<<endl){ for(int j=1;j<=n;j++){ cout<<a[i][j]<<" "; } } cout<<"--------------"<<endl; } }I; int n,x[maxn],y[maxn],q; struct node{ int l,r; Mat mat; void cov(int p){ mat.a[1][1]=1,mat.a[1][2]=mat.a[1][3]=mat.a[1][4]=0; mat.a[2][1]=0,mat.a[2][2]=y[p],mat.a[2][3]=(2*y[p])%mod,mat.a[2][4]=0; mat.a[3][1]=x[p],mat.a[3][2]=0,mat.a[3][3]=(1ll*y[p]*y[p])%mod,mat.a[3][4]=0; mat.a[4][1]=0,mat.a[4][2]=mat.a[4][3]=mat.a[4][4]=1; } }tr[maxn*4]; int ls(int u){ return (u<<1); } int rs(int u){ return (u<<1)|1; } bool ir(int L,int R,int l,int r){ return (L<=l)&&(r<=R); } bool ofr(int L,int R,int l,int r){ return (R<l)||(r<L); } void pushup(int u){ if(tr[u].l==tr[u].r) return ; tr[u].mat=(tr[ls(u)].mat*tr[rs(u)].mat); } void build(int u,int l,int r){ tr[u].l=l,tr[u].r=r,tr[u].mat.n=4; if(l==r) return tr[u].cov(l),void(); int mid=(l+r)>>1; build(ls(u),l,mid),build(rs(u),mid+1,r),pushup(u); } void upd(int u,int x){ if(tr[u].l==tr[u].r) return tr[u].cov(x),void(); int mid=(tr[u].l+tr[u].r)>>1; if(x<=mid) upd(ls(u),x); else upd(rs(u),x); pushup(u); } Mat query(int u,int l,int r){ if(ir(l,r,tr[u].l,tr[u].r)) return tr[u].mat; else if(!ofr(l,r,tr[u].l,tr[u].r)) return query(ls(u),l,r)*query(rs(u),l,r); else return I; } void solve(){ cin>>n>>q,n++,I.n=4,I.getI(); build(1,1,n); while(q--){ char op; int i,v; cin>>op>>i,i++; if(op=='x') cin>>v,x[i]=v,upd(1,i); if(op=='y') cin>>v,y[i]=v,upd(1,i); if(op=='a'){ Mat res=query(1,1,i-1); // res.output(); ll s=0; for(int i=1;i<=4;i++) s+=res.a[i][1]; cout<<s%mod<<endl; } } } int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int t=1; // cin>>t; while(t--) solve(); return 0; } /* Samples input: output: THINGS TODO: ??freopen??????? ???? ???????????? */