Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum
阿新 • • 發佈:2018-10-31
由題意可以知道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; }