You are given two huge binary integer numbers aa and bb of lengths nn and mmrespectively. You will repeat the following process: if b>0b>0, then add to the answer the value a & ba & b and divide bb by 22 rounding down (i.e. remove the last digit of bb), and repeat the process again, otherwise stop the process.

The value a & ba & b means bitwise AND of aa and bb. Your task is to calculate the answer modulo 998244353998244353.

Note that you should add the value a & ba & b to the answer in decimal notation, not in binary. So your task is to calculate the answer in decimal notation. For example, if a=10102 (1010)a=10102 (1010) and b=10002 (810)b=10002 (810), then the value a & ba & b will be equal to 88, not to 10001000.

Input

The first line of the input contains two integers nn and mm (1≤n,m≤2⋅1051≤n,m≤2⋅105) — the length of aa and the length of bb correspondingly.

The second line of the input contains one huge integer aa. It is guaranteed that this number consists of exactly nn zeroes and ones and the first digit is always 11.

The third line of the input contains one huge integer bb. It is guaranteed that this number consists of exactly mm zeroes and ones and the first digit is always 11.

Output

Print the answer to this problem in decimal notation modulo 998244353998244353.

Examples

Input
4 4
1010
1101
Output
12
Input
4 5
1001
10101
Output
11

Note

The algorithm for the first example:

  1. add to the answer 10102 & 11012=10002=81010102 & 11012=10002=810 and set b:=110b:=110;
  2. add to the answer 10102 & 1102=102=21010102 & 1102=102=210 and set b:=11b:=11;
  3. add to the answer 10102 & 112=102=21010102 & 112=102=210 and set b:=1b:=1;
  4. add to the answer 10102 & 12=02=01010102 & 12=02=010 and set b:=0b:=0.

So the answer is 8+2+2+0=128+2+2+0=12.

The algorithm for the second example:

  1. add to the answer 10012 & 101012=12=11010012 & 101012=12=110 and set b:=1010b:=1010;
  2. add to the answer 10012 & 10102=10002=81010012 & 10102=10002=810 and set b:=101b:=101;
  3. add to the answer 10012 & 1012=12=11010012 & 1012=12=110 and set b:=10b:=10;
  4. add to the answer 10012 & 102=02=01010012 & 102=02=010 and set b:=1b:=1;
  5. add to the answer 10012 & 12=12=11010012 & 12=12=110 and set b:=0b:=0.

So the answer is 1+8+1+0+1=111+8+1+0+1=11.

题意:

给你两个二进制的字符串a和b。(很长)

让你进行一下操作。

把答案加上 a&b的值。然后b右移一位。

上述操作直至b==0

求最后对998244353取模后的的答案。

思路:

我们来看一下样例1。

4 4
1010
1101 我们看b,1101 从最后一位看起,最后一位的1,只能&上一次a的最后一位,然后就被消除掉了(右移)
而倒数第二位的0,无论&上多少个数(不管是0还是1) 都不会对答案做出贡献。
继续看倒数第三位的1,他会&上a中的后三位才会被消除掉,会&上a中倒数第2位的1,那么会对答案产生2的贡献。
再看b的第一位的1,他会&上a中的后四位才会被消除掉,&上a中倒数第2个的1和倒数第4位的1,会对答案产生8+2的贡献,
加起来答案就是12。
不知道大家有没有发现什么规律?
b中每一位1都会&上a中对应位置以及后面的所有位。并且b这一位的贡献值就是a中这一位以及之后的数组成的二进制数的十进制数值大小。
那么我们不妨对a进行通过快速幂取模来求出a中每一位数值的前缀和,然后b中每一位1直接去加上那么数值就是贡献。
又因为a和b可能不一样长,我们为了方便把a和b翻转后再计算。
细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=;while(b){if(b%)ans=ans*a%MOD;a=a*a%MOD;b/=;}return ans;}
inline void getInt(int* p);
const int maxn=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
//string a,b;
int n,m;
char a[maxn];
char b[maxn];
const ll mod=998244353ll;
ll sum[maxn];
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
gbtb;
cin>>n>>m;
cin>>a>>b;
ll x=m-n;
reverse(a,a+n);
reverse(b,b+m); if(a[]=='')
{
sum[]=1ll;
}
for(ll i=1ll;i<max(n,m);++i)
{
if(a[i]=='')
{
sum[i]=sum[i-]+powmod(2ll,i,mod);
sum[i]=(sum[i]+mod)%mod;
}else
{
sum[i]=sum[i-];
}
}
ll ans=0ll;
for(ll i=0ll;i<max(n,m);++i)
{
if(b[i]=='')
{
ans+=sum[i];
ans=(ans+mod)%mod;
}
}
cout<<ans<<endl; return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}

Binary Numbers AND Sum CodeForces - 1066E (前缀和)的更多相关文章

  1. Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum

    E. Binary Numbers AND Sum 题目链接:https://codeforces.com/contest/1066/problem/E 题意: 给出两个用二进制表示的数,然后将第二个 ...

  2. Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum (二进制,前缀和)

    题意:有两个\(01\)字符串\(a\)和\(b\),每次让\(a\)和\(b\)进行与运算,将值贡献给答案,然后将\(b\)右移一位,直到\(b=0\). 题解:因为\(a\)不变,而\(b\)每次 ...

  3. E. Binary Numbers AND Sum

    链接 [http://codeforces.com/contest/1066/problem/E] 题意 给你长度分别为n,m的二进制串,当b>0时,对a,b,&运算,然后b右移一位,把 ...

  4. CF1066E Binary Numbers AND Sum

    思路: 模拟.实现: #include <iostream> using namespace std; ; ], b[]; ]; int main() { int n, m; while ...

  5. codefores 1066 E. Binary Numbers AND Sum

    这个题吧 你画一下就知道了 就拿这个例子来讲 4 5100110101 对于b串的话第5位只会经过a串的第4位,b串的第4位会经过a串的第3位和第4位.....b串的第1和第2位会经过a串的每一位 由 ...

  6. 【Leetcode_easy】1022. Sum of Root To Leaf Binary Numbers

    problem 1022. Sum of Root To Leaf Binary Numbers 参考 1. Leetcode_easy_1022. Sum of Root To Leaf Binar ...

  7. LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)

    1022. 从根到叶的二进制数之和 1022. Sum of Root To Leaf Binary Numbers 题目描述 Given a binary tree, each node has v ...

  8. HDU-1390 Binary Numbers

    http://acm.hdu.edu.cn/showproblem.php?pid=1390 Binary Numbers Time Limit: 2000/1000 MS (Java/Others) ...

  9. [LeetCode#110, 112, 113]Balanced Binary Tree, Path Sum, Path Sum II

    Problem 1 [Balanced Binary Tree] Given a binary tree, determine if it is height-balanced. For this p ...

随机推荐

  1. Java反序列化与远程代码执行

    https://mp.weixin.qq.com/s/asQIIF8NI_wvur0U0jNvGw 原创: feng 唯品会安全应急响应中心 2017-09-19 https://mp.weixin. ...

  2. golang gRPC初探

    gRPC使用protocol buffers作为Interface Definition Language (IDL). gRPC的底层信息交互格式也使用的是protocol buffers. 默认情 ...

  3. leecode 238除自身以外数组的乘积

    class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { //用除法必须要 ...

  4. Python_List对象内置方法详解

    目录 目录 前言 软件环境 列表List 修改列表的元素 插入列表元素 extend 将序列中的元素迭代的附加到list中 insert 在指定的索引号中插入一个元素 删除列表元素 del 删除Lis ...

  5. 运行上次失败用例(--lf 和 --ff)

    前言 “80%的bug集中在20%的模块,越是容易出现bug的模块,bug是越改越多“平常我们做手工测试的时候,比如用100个用例需要执行,其中10个用例失败了,当开发修复完bug后,我们一般是重点测 ...

  6. 慕课网_Java Socket应用---通信是这样练成的

    第1章 网络基础知识 1-1 网络基础简介 (10:21) 第2章 Java 中网络相关 API 的应用 2-1 Java 中的 InetAddress 的应用 (08:10) import java ...

  7. AJAX中同步和异步的区别和使用场景

    一.简介Ajax请求最重要的问题是代码执行的顺序.最长遇到的问题是,我们定义一个变量接收ajax异步请求的返回结果,后续代码使用,然而后续代码在使用时该变量为初始值,始终得不到想要的结果!!!二.示例 ...

  8. 主机加固之windows2003

    这篇与上一篇的win7主机加固内容大体类似,部分有些不同.这篇也可以用来尝试加固windows XP. 1. 配置管理 1.1用户策略 注意:在对Windows系统加固之前先新建一个临时的系统管理员账 ...

  9. 重新网格化(Remesh)

    原文链接 Remesh并没有一个严格的定义,简单的讲,Remesh就是从一个输入网格生成另一个网格,并且满足一定的要求.根据网格改动大小,可以分为这么几类: 保持顶点拓扑和几何信息,优化网格连接关系 ...

  10. 【FFMPEG】网络流媒体协议

    目录(?)[-] RTP RTCP SRTP SRTCP RTSP RTSP 和RTP的关系 SDP RTMPRTMPS mms HLS RTP           参考文档 RFC3550/RFC3 ...