CF1066E 题解

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
*/ 
posted @ 2024-03-07 13:35  Celestial_cyan  阅读(19)  评论(0)    收藏  举报