Skip to content

403B

Solution

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

#define D(x) 

const int MAX_N = int(1e4);
const int MAX_M = int(1e4);

int n, m;
int value[MAX_M];
int bad[MAX_N];
int gcd_array[MAX_N];

int gcd(int a,int b){
    if (a==0) return 1;
    if (a<0) return gcd(-a,b);
    while (b){
    int t=a%b; a=b; b=t;
    }
    return a;
}

bool is_bad(int a)
{
    return a == *lower_bound(bad, bad + m, a);
}

int cal(int a)
{
    D(printf("%d ", a));
    int ret = 0;
    for (int i = 2; i * i <= a; i++)
    {
        while (a % i == 0)
        {
            if (is_bad(i))
                ret--;
            else
                ret++;
            a /= i;
        }
    }
    if (a == 1)
    {
        D(printf("%d\n", ret));
        return ret;
    }
    if (is_bad(a))
        ret--;
    else
        ret++;
    D(printf("%d\n", ret));
    return ret;
}

int main()
{
    //input
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &value[i]);
    }
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &bad[i]);
    }

    //work
    int temp = value[0];
    for (int i = 0; i < n; i++)
    {
        temp = gcd(temp, value[i]);
        gcd_array[i] = temp;
    }
    temp = 1;
    for (int i = n - 1; i >= 0; i--)
    {
        if (cal(gcd_array[i] / temp) < 0)
        {
            temp = gcd_array[i];
        }
        value[i] /= temp;
    }

    int ans = 0;
    for (int i = 0; i < n; i++)
    {
        ans += cal(value[i]);
    }
    printf("%d\n", ans);
    return 0;
}