CF2077C Binary Subsequence Value Sum题解
- 当
\delta_v 为偶数时,上式等于\frac{\delta_v^2}{4}
所以上述式子等于
发现
设
设
我们分别解决
cnt_{0/1}^2 之和
以
显然答案为
根据开头提到的
那么同理,
cnt_0cnt_1 之和
显然答案为
用开头提到的
那么答案就等于:
等于(为了简洁,以下以
在修改过程中维护
代码
#include<bits/stdc++.h>
#define cint const int
#define uint unsigned int
#define cuint const unsigned int
#define ll long long
#define cll const long long
#define ull unsigned long long
#define cull const unsigned long long
#define sh short
#define csh const short
#define ush unsigned short
#define cush const unsigned short
using namespace std;
int read()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch-'0');
ch=getchar();
}
return x;
}
void print(cint x)
{
if(x<10)
{
putchar(x+'0');
return;
}
print(x/10);
putchar(x%10+'0');
}
void princh(cint x,const char ch)
{
print(x);
putchar(ch);
}
cint mod=998244353,iv2=499122177,iv4=1ll*iv2*iv2%mod;
int n,q,c[2];
bool a[200001];
int pw[400001];
void init()
{
pw[0]=1;
for(int i=1;i<=4e5;++i)
{
pw[i]=(pw[i-1]<<1)%mod;
}
}
int PW(cint x)
{
if(x==-1)return iv2;
if(x==-2)return iv4;
return pw[x];
}
int calc(cint x,cint y)
{
return 1ll*iv4*(1ll*x*(x+1)%mod*PW(x+y-2)%mod+1ll*y*(y+1)%mod*PW(x+y-2)%mod+(mod-1ll*x*y%mod*PW(x+y-1)%mod)%mod+(mod-PW(x+y-1)))%mod;
}
void query()
{
cint x=read();
--c[a[x]];
a[x]^=1;
++c[a[x]];
princh(calc(c[0],c[1]),'\n');
}
void solve()
{
n=read();
q=read();
char ch=getchar();
while(ch!='0'&&ch!='1')ch=getchar();
c[0]=c[1]=0;
for(int i=1;i<=n;++i)
{
a[i]=ch-'0';
++c[a[i]];
ch=getchar();
}
while(q--)query();
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
init();
int T=read();
while(T--)solve();
return 0;
}
证明
证明 \sum_{i=0}^nC_n^ii=n2^{n-1}
考虑
考虑组合意义,即从
则原式等于