题解:P17729 [SCP-J 2026] 进位 / carry
hehaoyanghy · · 题解
此篇题解主要是讲述跳
具体做法
首先因为我们只统计了非零的数,所以只需要固定一个左端点后从左向右枚举至多
首先我们先不考虑零,我们用
接着我们考虑零,此时我们弄一个新序列
最后别忘记在一开始的时候在
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[500009],p[500009],c[500009],k,T;
int jw(int x,int y) {
return __builtin_popcountll(x)+__builtin_popcountll(y)-__builtin_popcountll(x+y);
}
const int mod=998244353;
signed main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>T;
while(T--) {
cin>>n;
int y=1;
for(int i=1; i<=n; i++) {
int x;
cin>>x;
if(!x) y++;
else a[++k]=x,p[k]=i,c[k]=y,y=1;
}
p[k+1]=n+1;
for(int i=1; i<=k; i++) {
int s=a[i],f=0;
for(int j=i+1; j<=k; j++) {
f+=jw(s,a[j]),s+=a[j];
if(f==1) {
n=(n+(p[j+1]-p[j])*c[i]%mod)%mod;
c[j]=(c[j]+c[i])%mod,c[j+1]=(c[j+1]+(p[j+1]-p[j]-1)*c[i]%mod)%mod;
}
if(f>1) break;
}
}
cout<<n<<'\n';
for(int i=1; i<=k+1; i++) a[i]=c[i]=p[i]=0;
k=0;
}
return 0;
}