E. Binary Numbers AND Sum
题目链接:https://codeforces.com/contest/1066/problem/E
题意:
给出两个用二进制表示的数,然后将第二个二进制不断地往右边移一位,每次答案加上这两个的交集,求最后的答案。
题解:
考虑第二个二进制每一位对答案的贡献就行了,然后对第一个二进制算前缀和就ok了。
代码如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+5,MOD = 998244353 ; ll n,m; char s1[N],s2[N]; ll sum[N]; ll qp(ll a,ll b){ ll ans = 1; while(b){ if(b&1) ans=a*ans%MOD; a=a*a%MOD; b>>=1; } return ans ; } int main(){ scanf("%d%d",&n,&m); scanf("%s",s1); scanf("%s",s2); if(s1[n-1]=='1') sum[0]=1; for(int i=n-2;i>=0;i--){ if(s1[i]=='1') sum[n-i-1]=(sum[n-i-2]+qp(2,n-1-i))%MOD; else sum[n-i-1]=sum[n-i-2]; } ll ans = 0; for(int i=m-1;i>=0;i--){ if(s2[i]=='1'){ ans=(ans+sum[min(m-1-i,n-1)])%MOD; } } cout<<ans; return 0; }