[题解]CF1066E Binary Numbers AND Sum
思路
考虑对于每一个 上数位进行分析。令 表示 在二进制表示中从左往右数的第 位上的数字, 同理。
分类讨论一下 的取值对于答案的贡献:
- 如果 ,对于这一位无论如何都不会拥有贡献。
- 如果 ,因为 会向右移,所以能产生贡献的一定是 的位置,其中 。那么可以用前缀和维护这个东西,令 表示 的数量。所以贡献就是 。
当然你需要使 位数相同,才好处理,所以在较短的数前面加前导零即可。
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 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】