set..map..
质因数分解。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
int p[5050];
int g[5050];
set<int> b;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int get(int x)
{
int i,j;
map<int,int> m;
for(i=2;i*i<=x;i++)
{
if(x%i==0)
{
while(x%i==0)
{
m[i]++;
x/=i;
}
}
}
if(x!=1) m[x]++;
map<int,int>::iterator it;
int ans=0;
for(it=m.begin();it!=m.end();it++)
{
if(b.find((*it).first)!=b.end())
ans-=(*it).second;
else
ans+=(*it).second;
}
return ans;
}
int main()
{
int n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&p[i]);
for(i=0;i<m;i++)
{
scanf("%d",&k);
b.insert(k);
}
int sum=0;
for(i=0;i<n;i++)
sum+=get(p[i]);
g[0]=p[0];
for(i=1;i<n;i++)
g[i]=gcd(g[i-1],p[i]);
int h=1,t,res;
for(i=n-1;i>=0;i--)
{
t=g[i]/h;
res=get(t);
if(res<0){
sum-=res*(i+1);
h*=t;
}
}
printf("%d\n",sum);
//system("pause");
}