In this HackerRank Xor and Sum problem solution, we have given two positive integers a and b in binary representation and we need to find the summation of A with exclusive OR with the binary shift to the left of b to i. where i is given from zero to 314159.
Problem solution in Python.
a = int(input(),2) b = int(input(),2) #print((int(a,2) ^ (int(b,2)*(2**314160-1))) % (10**9 + 7)) s = 0 for i in range(314159+1): s += a ^ (b << i) print(s % (10**9+7))
Problem solution in Java.
import java.util.*; import javax.jws.Oneway; public class Solution { public static void main(String[] args) { Scanner in = new Scanner(System.in); String a, b; long sum, mod; long max = 314159; mod = 1000000007; a = in.next(); b = in.next(); int nA[] = new int[a.length()]; int nB[] = new int[b.length()]; setInverse(nA, a); setInverse(nB, b); sum = 0; long pow = 1; long count = 0; int len = Math.max(nA.length, nB.length); for (int i = 0; i < max; i++) { if (i < nB.length) count += nB[i]; long multiplier = (i < nA.length && nA[i] == 1) ? max - count + 1 : count; sum = (sum + pow * multiplier) % mod; pow = (pow << 1) % mod; } for(int i = 0; i < nB.length; ++i){ sum = (sum + pow*count) % mod; pow = (pow << 1L) % mod; count -= nB[i]; } System.out.println(sum); in.close(); } private static void setInverse(int[] nA, String a) { StringBuffer sb = new StringBuffer(a); sb.reverse(); for (int i = 0; i < a.length(); i++) { nA[i] = sb.charAt(i) - '0'; } } }
Problem solution in C++.
#include <cmath> #include <cstdio> #include <vector> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int maxn = 500005; const LL Mod = 1000000007; char a[maxn],b[maxn]; int lena,lenb,l; int sum[maxn]; LL ans; int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ scanf("%s",a); scanf("%s",b); lena = strlen(a); lenb = strlen(b); sum[0] = b[lenb-1] == '1'; for (int i = lenb-2;i >= 0; i--) sum[lenb-1-i] = sum[lenb-i-2] + (b[i] == '1'); ans = 0; l = max(lena,lenb+314159); LL p = 1; for (int i = lenb; i <= l; i++) sum[i] = sum[i-1]; for (int i = 0;i < l; i++) { int t = 0; LL w; if (i < lena) t = a[lena-1-i] == '1'; if (i <= 314159) w = sum[i]; else w = sum[i]-sum[i-314160]; if (t == 1) w = 314160-w; ans = (ans + w*p)%Mod; p = p*2%Mod; } ans = (ans+Mod)%Mod; printf("%lldn",ans); return 0; }
Problem solution in C.
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #define TOTALS 314160 #define M 1000000007 char a[100003], b[100003]; int cntof1[100003]; int main() { long long sum, len, an, bn, i, mul, cnt; //freopen("input.txt", "r", stdin); scanf("%s%s", a, b); an = strlen(a); bn = strlen(b); memset(cntof1, 0, sizeof(cntof1)); for (i = bn - 1, len = 1; i>=0; --i, ++len) { cntof1[len] = cntof1[len - 1] + (b[i] == '1' ? 1 : 0); } sum = len = 0; mul = 1; for (i = an - 1; ; --i) { if (++len > TOTALS-1 + bn) break; if (len <= bn) { cnt = cntof1[len]; }else { cnt = cntof1[bn]; } if (len > TOTALS) { cnt -= cntof1[len - TOTALS]; } if (i >= 0 && a[i] == '1') { sum = (sum + ((TOTALS - cnt)*mul%M)) % M; }else { sum = (sum + (cnt * mul%M)) % M; } mul = (mul << 1) % M; } printf("%lldn", sum); return 0; }