由题意可以知道a&b产生的值对答案有m次贡献,按次算贡献值是肯定超时的,所以按位算贡献,观察可以发现只有a这个二进制数里的1对答案有贡献,贡献值为pre[i]*这个1对应的值(即假如这个1是第i为,则这个1对应的值就是2^(i-1)),pre[i]表示二进制数b第i位及前面1的个数,用前缀和的思想求。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
const int maxn=2e5+10;
int a[maxn],b[maxn],pre[maxn],n,m;
ll quickpower(ll a,ll b,ll c)
{
ll res=1;
a%=c;
while(b)
{
if(b&1)
res=(res*a)%c;
a=(a*a)%c;
b=b>>1;
}
return res;
}
int main()
{
int tmp=0;
ll ans=0;
scanf("%d %d",&n,&m);
for(int i=n;i>=1;i--)
{
char ch;
scanf(" %c",&ch);
a[i]=ch-'0';
}
for(int i=m;i>=1;i--)
{
char ch;
scanf(" %c",&ch);
b[i]=ch-'0';
}
for(int i=max(n,m);i>=n;i--)
if(b[i]==1)
tmp++;
pre[n]=tmp;
for(int i=n-1;i>=1;i--)
if(b[i]==1)
pre[i]=pre[i+1]+1;
else
pre[i]=pre[i+1];
for(int i=n;i>=1;i--)
{
if(a[i]==1)
ans=(ans+(pre[i]*quickpower(2,i-1,mod))%mod)%mod;
}
printf("%d
",ans);
return 0;
}