Rudolf is on his way to the castle. Before getting into the castle, the security staff asked him a question:

Given two binary numbers a and b of length n. How many different ways of swapping two digits in a (only in a, not b) so that bitwise OR of these two numbers will be changed? In other words, let c be the bitwise OR of a and b, you need to find the number of ways of swapping two bits in a so that bitwise OR will not be equal to c.

Note that binary numbers can contain leading zeros so that length of each number is exactly n.

[Bitwise OR](https://en.wikipedia.org/wiki/Bitwise_operation#OR) is a binary operation. A result is a binary number which contains a one in each digit if there is a one in at least one of the two numbers. For example, 01010_2 OR 10011_2 = 11011_2.

Well, to your surprise, you are not Rudolf, and you don't need to help him… You are the security staff! Please find the number of ways of swapping two bits in a so that bitwise OR will be changed.

Input

The first line contains one integer n (2≤ n≤ 10^5) — the number of bits in each number.

The second line contains a binary number a of length n.

The third line contains a binary number b of length n.

Output

Print the number of ways to swap two bits in a so that bitwise OR will be changed.

Examples

Input

5
01011
11001


Output

4


Input

6
011000
010011


Output

6

Note

In the first sample, you can swap bits that have indexes (1, 4), (2, 3), (3, 4), and (3, 5).

In the second example, you can swap bits that have indexes (1, 2), (1, 3), (2, 4), (3, 4), (3, 5), and (3, 6).
import java.io.*;
import java.util.*;

public class Stack3 {

    static class Reader {
        final private int BUFFER_SIZE = 1 << 16;
        private DataInputStream din;
        private byte[] buffer;
        private int bufferPointer, bytesRead;

        public Reader() {
            din = new DataInputStream(System.in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public Reader(String file_name) throws IOException {
            din = new DataInputStream(new FileInputStream(file_name));
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public String readLine() throws IOException {
            byte[] buf = new byte[64]; // line length
            int cnt = 0, c;
            while ((c = read()) != -1) {
                if (c == '\n')
                    break;
                buf[cnt++] = (byte) c;
            }
            return new String(buf, 0, cnt);
        }

        public int nextInt() throws IOException {
            int ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');
            if (neg)
                return -ret;
            return ret;
        }

        public long nextLong() throws IOException {
            long ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            }
            while ((c = read()) >= '0' && c <= '9');
            if (neg)
                return -ret;
            return ret;
        }

        public double nextDouble() throws IOException {
            double ret = 0, div = 1;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            }
            while ((c = read()) >= '0' && c <= '9');
            if (c == '.') {
                while ((c = read()) >= '0' && c <= '9') {
                    ret += (c - '0') / (div *= 10);
                }
            }
            if (neg)
                return -ret;
            return ret;
        }

        private void fillBuffer() throws IOException {
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
            if (bytesRead == -1)
                buffer[0] = -1;
        }

        private byte read() throws IOException {
            if (bufferPointer == bytesRead)
                fillBuffer();
            return buffer[bufferPointer++];
        }

        public void close() throws IOException {
            if (din == null)
                return;
            din.close();
        }
    }

    static Reader sc = new Reader();
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static long mod = (long) (1e9 + 7);

    public static void main(String[] args) throws IOException {
        /*
         * For integer input: int n=inputInt();
         * For long input: long n=inputLong();
         * For double input: double n=inputDouble();
         * For String input: String s=inputString();
         * Logic goes here
         * For printing without space: print(a+""); where a is a variable of any datatype
         * For printing with space: printSp(a+""); where a is a variable of any datatype
         * For printing with new line: println(a+""); where a is a variable of any datatype
         */
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String a=sc.next();
        String b=sc.next();
        long c1=0;//no. of zeros
        long c2=0;//no. of zeros with 0 bottom
        long c3=0;//no. of ones with 0 bottom
        long c4=0;//no. of ones
        long[] c11=new long[n];
        long[] c21=new long[n];
        long[] c31=new long[n];
        long[] c41=new long[n];
        for(int j=a.length()-1;j>=0;j--){
            char chu=a.charAt(j);
            char chd=b.charAt(j);
            if(chu=='0'){
                c1++;
            }
            if(chu=='0' && chd=='0'){
                c2++;
            }
            if(chu=='1'){
                c4++;
            }
            if(chu=='1' && chd=='0'){
                c3++;
            }
            c11[j]=c1;
            c21[j]=c2;
            c31[j]=c3;
            c41[j]=c4;
        }
        long ans=0;
        for(int j=0;j<a.length()-1;j++){
            char chu=a.charAt(j);
            char chd=b.charAt(j);
            if(chu=='0' && chd=='0'){
                ans+=c41[j+1];
            }
            if(chu=='1' && chd=='1'){
                ans+=c21[j+1];
            }
            if(chu=='1' && chd=='0'){
                ans+=c11[j+1];
            }
            if(chu=='0' && chd=='1'){
                ans+=c31[j+1];
            }
        }
        System.out.println(ans);



        bw.flush();
        bw.close();


    }

    public static boolean checkPalin(char[] ar) {
        int n = ar.length;
        for (int i = 0; i < ar.length; i++) {
            if (i <= (n - 1 - i)) {
                if (ar[i] != ar[n - 1 - i]) {
                    return false;
                }
            }
        }
        return true;
    }

    public static long getAns(int n, int i, long[][] dp, int k) {
        if (k <= 0) {
            return 1;
        }
        if (dp[i][k] != -1) {
            return dp[i][k];
        }
        long ans = 0;
        for (int j = i; j <= n; j += i) {
            ans += getAns(n, j, dp, k - 1) % mod;
            ans %= mod;
        }
        dp[i][k] = ans % mod;
        return dp[i][k];
    }

    public static void dfs1(List<List<Integer>> g, boolean[] visited, Stack<Integer> stack, int num) {
        visited[num] = true;
        for (Integer integer : g.get(num)) {
            if (!visited[integer]) {
                dfs1(g, visited, stack, integer);
            }
        }
        stack.push(num);
    }

    public static void dfs2(List<List<Integer>> g, boolean[] visited, List<Integer> list, int num, int c, int[] raj) {
        visited[num] = true;

        for (Integer integer : g.get(num)) {
            if (!visited[integer]) {
                dfs2(g, visited, list, integer, c, raj);
            }
        }
        raj[num] = c;
        list.add(num);

    }

    public static int inputInt() throws IOException {
        return sc.nextInt();
    }

    public static long inputLong() throws IOException {
        return sc.nextLong();
    }

    public static double inputDouble() throws IOException {
        return sc.nextDouble();
    }

    public static String inputString() throws IOException {
        return sc.readLine();
    }

    public static void print(String a) throws IOException {
        bw.write(a);
    }

    public static void printSp(String a) throws IOException {
        bw.write(a + " ");
    }

    public static void println(String a) throws IOException {
        bw.write(a + "\n");
    }


    public static long getAns(int[] ar, int c, long[][] dp, int i, int sign) {
        if (i < 0) {
            return 1;
        }

        if (c <= 0) {
            return 1;
        }

        dp[i][c] = Math.max(dp[i][c], Math.max(ar[i] * getAns(ar, c - 1, dp, i - 1, sign), getAns(ar, c, dp, i - 1, 1)));
        return dp[i][c];
    }


    public static long power(long a, long b, long c) {
        long ans = 1;
        while (b != 0) {
            if (b % 2 == 1) {
                ans = ans * a;
                ans %= c;
            }
            a = a * a;
            a %= c;
            b /= 2;
        }
        return ans;
    }

    public static long power1(long a, long b, long c) {
        long ans = 1;
        while (b != 0) {
            if (b % 2 == 1) {
                ans = multiply(ans, a, c);
            }
            a = multiply(a, a, c);
            b /= 2;

        }
        return ans;

    }

    public static long multiply(long a, long b, long c) {
        long res = 0;
        a %= c;
        while (b > 0) {
            if (b % 2 == 1) {
                res = (res + a) % c;
            }
            a = (a + a) % c;
            b /= 2;
        }

        return res % c;

    }

    public static long totient(long n) {
        long result = n;
        for (long i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                //sum=sum+2*i;
                while (n % i == 0) {
                    n /= i;
                    // sum=sum+n;
                }
                result -= result / i;

            }
        }
        if (n > 1) {
            result -= result / n;

        }
        return result;
    }


    public static long gcd(long a, long b) {
        if (b == 0) {
            return a;
        } else {
            return gcd(b, a % b);
        }
    }

    public int sumOfFlooredPairs(int[] nums) {
        // long sum=0;
        long mod = (long) (1e9 + 7);
        Arrays.sort(nums);
        long[] numerator = new long[nums.length];
        long[] denominator = new long[nums.length];

        long[] numerator1 = new long[nums.length];
        long[] denominator1 = new long[nums.length];

        long num = 1;
        long den = nums[0];
        numerator[0] = 1;
        denominator[0] = den;
        long num1 = 1;
        long den1 = nums[nums.length - 1];
        numerator1[nums.length - 1] = 1;
        denominator1[nums.length - 1] = den1;


        for (int i = 1; i < nums.length; i++) {

            long gcd1 = gcd(denominator[i - 1], nums[i]);
            long lcm = (denominator[i - 1] * nums[i]) / gcd1;
            long n1 = lcm / denominator[i - 1] * numerator[i - 1] + lcm / nums[i];
            numerator[i] = n1;
            denominator[i] = lcm;

            long gcd2 = gcd(denominator1[nums.length - i], nums[nums.length - 1 - i]);
            long lcm1 = (denominator1[nums.length - i] * nums[nums.length - 1 - i]) / gcd2;
            long n2 = lcm1 / denominator1[nums.length - i] * numerator1[nums.length - i] + lcm1 / nums[nums.length - 1 - i];
            numerator1[nums.length - 1 - i] = n2;
            denominator1[nums.length - 1 - i] = lcm1;




           /* prefix[i]=sum;
            sum12+=1d/nums[nums.length-1-i];
            prefix2[nums.length-1-i]=sum12;*/

        }
        /*System.out.println(Arrays.toString(numerator));
         System.out.println(Arrays.toString(denominator));*/
        int sum2 = 0;
        for (int i = 0; i < nums.length; i++) {
            //float d1=(float)(numerator[i]/(double)denominator[i]);
            sum2 += (int) (Math.floor((numerator[i] * nums[i]) / (double) denominator[i]));
            sum2 %= mod;
            if (i + 1 < nums.length) {
                // float d2=(float)(numerator1[i+1]/(double)denominator1[i+1]);
                sum2 += (int) (Math.floor((numerator1[i + 1] * nums[i]) / (double) denominator1[i + 1]));
                sum2 %= mod;
            }
        }
        return sum2;


    }

    public static boolean[] primes(int n) {
        boolean[] p = new boolean[n + 1];
        p[0] = false;
        p[1] = false;
        for (int i = 2; i <= n; i++) {
            p[i] = true;
        }

        for (int i = 2; i * i <= n; i++) {
            if (p[i]) {
                for (int j = i * i; j <= n; j += i) {
                    p[j] = false;
                }
            }

        }
        return p;
    }

}