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

版权声明:菜鸡博客大佬随便转 https://blog.csdn.net/qq_40642465/article/details/83042099

  由题意可以知道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\n",ans);
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/83042099