CodeForces - 1066E . Binary Numbers AND Sum

Binary Numbers AND Sum

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

The value a & b means bitwise AND of a and b. Your task is to calculate the answer modulo 998244353.

Note that you should add the value a & 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) and b=10002 (810), then the value a & b will be equal to 8, not to 1000.

Input

The first line of the input contains two integers n and m (1≤n,m≤2⋅105) — the length of a and the length of b correspondingly.

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

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

Output

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

Examples

Input

4 4
1010
1101

Output

12

Input

4 5
1001
10101

Output

11

Note

The algorithm for the first example:

add to the answer 10102 & 11012=10002=810 and set b:=110;
add to the answer 10102 & 1102=102=210 and set b:=11;
add to the answer 10102 & 112=102=210 and set b:=1;
add to the answer 10102 & 12=02=010 and set b:=0.
So the answer is 8+2+2+0=12.

The algorithm for the second example:

add to the answer 10012 & 101012=12=110 and set b:=1010;
add to the answer 10012 & 10102=10002=810 and set b:=101;
add to the answer 10012 & 1012=12=110 and set b:=10;
add to the answer 10012 & 102=02=010 and set b:=1;
add to the answer 10012 & 12=12=110 and set b:=0.
So the answer is 1+8+1+0+1=11.

理解
有两个巨大的二进制数a和b。
重复以下过程:如果b> 0,则让答案加上a&b并将b除以2下取整,然后再次重复该过程,否则停止该过程。
a&b表示a和b的按位AND。 计算答案模998244353。

实现代码:

//我感觉需要注意的就是,每次计算后都要取模
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

const long long mod = 998244353;
int s1[200005];
int s2[200005];
char s[200005];

int main()
{
    int n, m;
    std::cin >> n >> m;
    memset(s1, 0, sizeof s1);
    memset(s2, 0, sizeof s2);
    std::cin >> s;
    for(int i = 0; i < n; i++)
        s1[n - i - 1] = s[i] - '0';
    std::cin >> s;
    for(int i = 0; i < m; i++)
    {
        s2[m - i - 1] = s[i] - '0';
        if(i)
            s2[m - i - 1] += s2[m - i];
    }
    long long power = 1;
    long long sum = 0;
    for(int i = 0; i <= std::max(n, m); i++)
    {
        if(s1[i])
        {
            sum += s2[i] * power % mod;
            sum %= mod;
        }
        power = power * 2 % mod;
    }
    std::cout << sum << std::endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值