首页 > 代码库 > codeforces Upgrading Array
codeforces Upgrading Array
思路:对于每个数分解质因子然后记录每一个质因子的个数,对与在b中出现的质因子就减去1,否则加1,求出总的,然后从后面一次对它们的最大公约数,然后判断除以最大公约数之后,改变量是不是变化,求最大值,变化量为负值的话减去。
1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 #include <set> 5 #include <algorithm> 6 using namespace std; 7 8 set<int>q; 9 int n,m;10 int a[50010],b[50010];11 int g[50010];12 13 int gcd(int a,int b)14 {15 return b==0?a:gcd(b,a%b);16 }17 18 int Get_num(int x)19 {20 int ans=0;21 map<int,int>p;22 for(int j=2; j*j<=x; j++)23 {24 if(x%j==0)25 {26 while(x%j==0)27 {28 p[j]++;29 x/=j;30 }31 }32 }33 if(x>1) p[x]++;34 map<int,int>::iterator it;35 for(it=p.begin(); it!=p.end(); it++)36 {37 if(q.find(it->first)==q.end()) ans+=it->second;38 else ans-=it->second;39 }40 return ans;41 }42 43 int main()44 {45 46 scanf("%d%d",&n,&m);47 for(int i=1; i<=n; i++)48 {49 scanf("%d",&a[i]);50 }51 for(int j=1; j<=m; j++)52 {53 scanf("%d",&b[j]);54 q.insert(b[j]);55 }56 int ans=0;57 for(int i=1; i<=n; i++)58 {59 ans+=Get_num(a[i]);60 }61 for(int i=1; i<=n; i++)62 {63 if(i==1) g[i]=a[i];64 else g[i]=__gcd(g[i-1],a[i]);65 }66 int c=1;67 for(int i=n; i>=1; i--)68 {69 int h=g[i]/c;70 int s=Get_num(h);71 if(s<0)72 {73 ans-=s*i;74 c*=h;75 }76 }77 printf("%d\n",ans);78 return 0;79 }
codeforces Upgrading Array
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。