CF1066EBinary Numbers AND Sum(前缀和,二进制)
题目大意
现在,给你两个位数为 n 和 m 的两个二进制数a,b,现在,我们要进行如下操作:
- 计算a&b
- 答案累加上一个操作的值
- bbb右移一位,最后一位直接舍弃
现在,请你算出最终的答案,并输出,答案对998244353取模
输入输出格式:
输入格式:
第一行,两个整数n,m,(1≤n,m≤2×105)
第一行,一个长度为n的二进制数a
第一行,一个长度为m的二进制数b
输出格式:
一行,一个数,表示答案
思路:
因为第一个二进制数不动,第二个在动,所以我们可以通过预处理第一个数来获得答案
因为是与,所以只有两个都是1时才会有答案的贡献
那么,比如说这个例子:
1001
11010
他就会有如下几种情况
01001
11010
1001
1101
1001
0110
1001
0011
1001
0001
我们会发现,第一位的1分别和上面的第一个1和最后一个1异或起来对答案有贡献
所以这个1对答案的贡献是8+1=9
我们把这个规律推广开来
对y中每一个1进行如上操作
即可得出答案
但是,我们会发现答案复杂度是O(n×m)的,过不了
所以我们要预处理
用前缀和跑一遍x即可
复杂度优化到O(m+n)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define rij register int j
#define p 998244353
#define int long long
using namespace std;
int a,b;
int x[],y[],bs[],qzh[];
void ycl()
{
bs[]=;
for(rii=;i<=;i++)
{
bs[i]=bs[i-]*;
bs[i]%=p;
}
}
signed main()
{
scanf("%lld%lld\n",&a,&b);
for(rii=;i<=a;i++)
{
x[i]=getchar()-'';
}
getchar();
for(rii=;i<=b;i++)
{
y[i]=getchar()-'';
}
ycl();
for(rii=a;i>=;i--)
{
qzh[a-i+]=qzh[a-i];
qzh[a-i+]+=x[i]*bs[a-i];
qzh[a-i+]%=p;
}
if(b>a)
{
for(rii=a+;i<=b;i++)
{
qzh[i]=qzh[i-];
}
}
// for(rii=1;i<=b;i++)
// {
// printf("%d ",qzh[i]);
// }
int ans=;
for(rii=;i<=b;i++)
{
ans+=y[i]*qzh[b-i+];
ans%=p;
}
cout<<ans%p;
}
CF1066EBinary Numbers AND Sum(前缀和,二进制)的更多相关文章
- Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum
E. Binary Numbers AND Sum 题目链接:https://codeforces.com/contest/1066/problem/E 题意: 给出两个用二进制表示的数,然后将第二个 ...
- Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum (二进制,前缀和)
题意:有两个\(01\)字符串\(a\)和\(b\),每次让\(a\)和\(b\)进行与运算,将值贡献给答案,然后将\(b\)右移一位,直到\(b=0\). 题解:因为\(a\)不变,而\(b\)每次 ...
- Binary Numbers AND Sum CodeForces - 1066E (前缀和)
You are given two huge binary integer numbers aa and bb of lengths nn and mmrespectively. You will r ...
- Codeforces Round #336 (Div. 2)B. Hamming Distance Sum 前缀和
B. Hamming Distance Sum 题目连接: http://www.codeforces.com/contest/608/problem/A Description Genos need ...
- 补写:Best Coder #85 1001 Sum(前缀和)
sum Accepts: 640 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...
- E. Binary Numbers AND Sum
链接 [http://codeforces.com/contest/1066/problem/E] 题意 给你长度分别为n,m的二进制串,当b>0时,对a,b,&运算,然后b右移一位,把 ...
- Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.
In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...
- hdu 5776 sum 前缀和
sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submi ...
- Codeforces 165 E. Compatible Numbers【子集前缀和】
LINK 题目大意 给你一个数组,问你数组中的每个数是否可以在数组里面找到一个数和他and起来是0,如果可以就输出这个数,否则就输出-1 思路 首先很显然的是可以考虑找到每个数每一位都取反的数的子集 ...
随机推荐
- ubuntu终端颜色设置
在 .bashrc中增加 PS1='${debian_chroot:+($debian_chroot)}\[\033[00;32m\]\u @ \h\[\033[00m\]:\[\033[00;34m ...
- Ubuntu上如何搭建Android开发环境
1.以下是开始Android应用程序编程之前需要的软件列表: a.Java JDK5 及以后版本 b.Java运行环境 c.Android Studio 2.安装Android Studio: x64 ...
- 指针的引用-ZZ
原文出处 复习数据结构的时候看到指针的引用,两年前学的细节确实有点想不起来,于是查了一下网上的资料,并且自己实践了一下,总结了一句话就是: 指针作为参数传给函数,函数中的操作可以改变指针所指向的对象和 ...
- Python学习---线程基础学习
线程基础 什么是线程(thread) 线程是CPU调度能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流[换言之,线程就是一堆指令集合], ...
- linux命令整理
Linux系统命令 1. ls 查看某个 目录下 所有文件的大小总和 ls -lR| awk 'BEGIN{size=0;} /^[-l]/{size+=$5;print $0;} END{print ...
- February 20 2017 Week 8 Monday
Behind every beautiful thing, there's some kind of pain. 美丽背后,必有努力. No pains, no gains, and sometime ...
- 三、基于任务的异步模式(TAP),推荐使用
一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...
- 解析纯真IP地址库
一周以来,一直在做 IP地址库的解析.从调研到编码到优化,大概花了有七八天的时间.感觉很好玩.总结一下整个做的过程. 1.关于IP 地址库的解析方式 目前主要的解析方式有两种:通过API,或通过IP数 ...
- 从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot
项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了Spring ...
- 【转】关于HTTP中文翻译的讨论
http://www.ituring.com.cn/article/1817 讨论参与者共16位: 图灵谢工 杨博 陈睿杰 贾洪峰 李锟 丁雪丰 郭义 梁涛 吴玺喆 邓聪 胡金埔 臧秀涛 张伸 图钉派 ...