[题解]CF1066E Binary Numbers AND Sum

思路

考虑对于每一个 a 上数位进行分析。令 ai 表示 a 在二进制表示中从左往右数的第 i 位上的数字,bi 同理。

分类讨论一下 ai 的取值对于答案的贡献:

  1. 如果 ai=0,对于这一位无论如何都不会拥有贡献。
  2. 如果 ai=1,因为 b 会向右移,所以能产生贡献的一定是 bj=1 的位置,其中 j[1,i]。那么可以用前缀和维护这个东西,令 si 表示 b1i=1 的数量。所以贡献就是 si×2ni

当然你需要使 a,b 位数相同,才好处理,所以在较短的数前面加前导零即可。

Code

#include <bits/stdc++.h>  
#define int long long  
#define re register  
  
using namespace std;  
  
const int N = 2e5 + 10,mod = 998244353;  
int n,m,ans;  
int s[N];  
string a,b;  
  
inline int Add(int a,int b){  
    return (a + b) % mod;  
}  
  
inline int Mul(int a,int b){  
    return a * b % mod;  
}  
  
inline int qmi(int a,int b){  
    int res = 1;  
    while (b){  
        if (b & 1) res = Mul(res,a);  
        a = Mul(a,a);  
        b >>= 1;  
    }  
    return res;  
}  
  
signed main(){  
    ios::sync_with_stdio(0);  
    cin.tie(0);  
    cout.tie(0);  
    string za,zb;  
    cin >> n >> m >> a >> b;  
    for (re int i = n;i < m;i++) za += '0';  
    for (re int i = m;i < n;i++) zb += '0';  
    if (za.size()) a = ' ' + za + a;  
    else a = ' ' + a;  
    if (zb.size()) b = ' ' + zb + b;  
    else b = ' ' + b;  
    n = m = max(n,m);  
    for (re int i = 1;i <= m;i++) s[i] = s[i - 1] + (b[i] == '1');  
    for (re int i = 1;i <= n;i++){  
        if (a[i] == '1') ans = Add(ans,Mul(s[i],qmi(2,n - i)));  
    }  
    cout << ans;  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18264020

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示