1. 程式人生 > >Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum

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

  由題意可以知道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;

}