Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum

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;
}

 

posted @ 2019-01-20 11:55  heyuhhh  阅读(90)  评论(0编辑  收藏  举报