# P4247 [清华集训2012]序列操作

2022-01-27 09:05:23  阅读：41  来源： 互联网

### $$1.$$假做法：

$f(k)=\dfrac{1}{k}\sum_{i=1}^k (-1)^{i-1}*s_i*f(k-i)$

/悲

### $$2.$$真做法：

$p_{f_i}=\sum_{j=0}^{i}ls_{f_j} \times rs_{f_{i-j}}$

$$Code:$$

// Problem: P4247 [清华集训2012]序列操作
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4247
// Memory Limit: 250 MB
// Time Limit: 6000 ms
// Author: jimmyywang
//

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,a,b) for(ll i=a;i<=b;i++)
#define wt int tt=d;while(tt--)
#define py puts("Yes")
#define pn puts("No")
#define fe(i,e) for(int i=0;i<e.size();i++)
#define vi vector<ll>
inline ll rd() {
ll x=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c))x=x*10+c-'0',c=getchar();
return x*f;
}
#define d rd()
#define pb push_back
const ll N=300010;
struct edge{ll v,w,nx;}e[N<<1];
ll hd[N],cnt;
void add(ll u,ll v,ll w){e[++cnt]=(edge){v,w,hd[u]};hd[u]=cnt;}
ll qp(ll a,ll b,ll p){
ll ans=1;while(b){
if(b&1)ans=ans*a%p;
a=a*a%p;b>>=1;
}return ans;
}ll n,m;
struct node{
ll s[21];
}t[50010<<2];
ll a[50010];
const ll mod=19940417;
node merge(node a,node b){
node ans;ans.s[0]=1;
f(i,1,20){
ans.s[i]=0;
f(j,0,i)ans.s[i]=(ans.s[i]+a.s[j]*b.s[i-j]%mod+mod)%mod;
}
return ans;
}
ll C[50010][25];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void upd(ll p){t[p]=merge(t[ls(p)],t[rs(p)]);}
ll tga[50010<<2];
ll tgb[50010<<2];
void build(ll l,ll r,ll p){
if(l==r){f(i,0,20)t[p].s[i]=0;
t[p].s[1]=(a[l]%mod+mod)%mod,t[p].s[0]=1;return;}
ll mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
upd(p);
}
void rev(ll p,ll len){
if(!p)return;
f(i,1,min(len,20ll))if(i&1)t[p].s[i]=mod-t[p].s[i];
tgb[p]=mod-tgb[p],tga[p]^=1;
}
void adi(ll p,ll x,ll len){
if(!p||!x)return;
for(int i=min(len,20ll);i>=1;i--){
ll tmp=x;for(int j=i-1;j>=0;j--)
t[p].s[i]=(t[p].s[i]+t[p].s[j]*tmp%mod*C[len-j][i-j]%mod)%mod,
t[p].s[i]=(t[p].s[i]+mod)%mod,tmp=tmp*x%mod;
}tgb[p]=(tgb[p]+x)%mod;
}
void pd(ll p,ll l,ll r){ll mid=(l+r)>>1;
if(tga[p])rev(ls(p),mid-l+1),rev(rs(p),r-mid),tga[p]=0;
}
void add(ll l,ll r,ll p,ll L,ll R,ll k){
pd(p,l,r);ll mid=(l+r)>>1;
upd(p);
}void rv(ll l,ll r,ll p,ll L,ll R){
if(L<=l&&r<=R){rev(p,r-l+1);return;}
pd(p,l,r);ll mid=(l+r)>>1;
if(mid>=L)rv(l,mid,ls(p),L,R);
if(mid<R)rv(mid+1,r,rs(p),L,R);
upd(p);
}
node ask(ll l,ll r,ll p,ll L,ll R){
if(L<=l&&r<=R)return t[p];
pd(p,l,r);ll mid=(l+r)>>1;
}
int main(){
n=d,m=d;
f(i,1,n)a[i]=d%mod;
C[0][0]=1;
f(i,1,n){
C[i][0]=1;
f(j,1,min(20ll,i))C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
build(1,n,1);
while(m--){
char c;cin>>c;
if(c=='I'){
ll l=d,r=d,x=(d%mod+mod)%mod;
}if(c=='R'){
ll l=d,r=d;
rv(1,n,1,l,r);
}if(c=='Q'){
ll l=d,r=d,k=d;
}
}
return 0;
}