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 思路 首先很显然的是可以考虑找到每个数每一位都取反的数的子集 ...
随机推荐
- aop postsharp的使用:在方法进入/成功/失败/退出时获取方法名和参数值
1.nuget安装postsharp 2.编写attribute标记 [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMult ...
- redux小结
1.创建reducers :保存初始化状态. 2.入口文件通过redux 中的 { createStore } 将 reducers保存为快照, 通过react-redux中的{ Provider } ...
- hiho一下 第一周 最长回文子串
时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这 ...
- RC4 加解密
加密解密都是这一个接口 int Rc4EncryptFile(std::string in_file_path, std::string out_file_path, const char *rc4_ ...
- 用虚拟信用卡注册Google Play开发者账号
本文首发于http://www.abcdsxg.cn/free/net/562 虚拟信用卡 首先介绍一下虚拟信用卡(Virtual Credit Card),顾名思义,虚拟就是没有实体卡,一般都是在提 ...
- PHP 调用web service接口(.net开发的接口)
实例代码1: try { $this->soapClientObj = new SoapClient(self::URL . '?wsdl', array('connection_timeout ...
- nginx https 连接加密
##HTTPS server##server {listen 443;server_name www.shabi.com;ssl on;index index.php index.html index ...
- 并发包CallableAndFuture
/** * * @描述: Callable Future * * 程序运行一个线程,线程运行结束后,我们可以获取另一个线程的结果 * * @作者: Wnj . * @创建时间: 2017年5月16日 ...
- PHP | 别家网站都有的登录功能,你的网站也可以有!
如果说一个网站是一个独立的王国,那登录功能就相当于这个[王国]的大门.进出往来的人必须要通过这道[门]才能进出这个[王国],这样才能有效的达到对人流量和用户的有效监管,也可以进一步了解每个用户的喜好, ...
- laravel 使用EasyWechat 3分钟完成微信支付(以APP支付为例)
上一篇写了支付宝支付,然后这段时间我又把微信支付给接上了,作为萌新的我还是很有成就感的,哈哈~~好了,该写正事了. 第一步:创建应用及配配置 首先到微信的官方平台注册应用https://pay.we ...