Codeforces Round #236 (Div. 2) D. Upgrading Array

来源:互联网 发布:淘宝买蜂蜜是真的吗 编辑:程序博客网 时间:2024/04/30 20:44

set..map..

质因数分解。。


#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<set>#include<map>using namespace std;#define inf 0x3f3f3f3fint 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;elseans+=(*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");}


0 0