Solution
首先不难想到计算 \(a\) 的每一位对答案产生的贡献,然后题目告诉我们 \(b\) 每次会往右移一位,然后结合样例可以发现:对于 \(a\) 的第 \(i\) 位,能与其产生贡献的条件是:\(a_i=1\) 且 \(b_j=1(i \leq j)\),对答案的贡献不难想出即为 \(2^{i-1} \times \sum\limits_{j=i}^{m}b_j\),用前缀和维护即可,时间复杂度为 \(O(n)\)。
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define il inline
#define db double
#define low(x) x&-x
#define pb(x) push_back(x)
#define debug() puts("-------")
using namespace std;
typedef pair<int,int> pii;
typedef pair<int,pii> PII;
const int N=2e5+10,Mod=998244353,INF=1e9+7;
int n,m;
int a[N],s[N];
struct Mind{
il bool operator<(Mind &Cyan)const{ }
};
il int read(){
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); }
while(c>='0'&&c<='9'){ x=(x<<3)+(x<<1)+c-48; c=getchar(); }
return x*f;
}
il int qmi(int x,int k){
int res=1;
while(k){
if(k&1) res=res*x%Mod;
x=x*x%Mod; k>>=1;
} return res;
}
signed main(){ char c;
n=read(),m=read(); int ans=0;
for(int i=1;i<=n;i++) cin>>c,a[i]=c-'0';
for(int i=1;i<=m;i++) cin>>c,s[i]=s[i-1]+(c-'0');
for(int i=n,j=m,p=0;i>=1&&j>=1;i--,j--,p++) if(a[i]) ans=(ans+s[j]*qmi(2ll,p)%Mod)%Mod;
printf("%lld\n",ans);
return 0;
} /*
10 1
1 2 3 7 2 6 8 10 10 7
*/
标签:10,int,题解,CF1066E,ans,Mod,define
From: https://www.cnblogs.com/Celestial-cyan/p/18058663