CF1066E 题解

Solution

首先不难想到计算 a 的每一位对答案产生的贡献,然后题目告诉我们 b 每次会往右移一位,然后结合样例可以发现:对于 a 的第 i 位,能与其产生贡献的条件是:ai=1bj=1(ij),对答案的贡献不难想出即为 2i1×j=imbj,用前缀和维护即可,时间复杂度为 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 @   Celestial_cyan  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示