首页 > 代码库 > 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 }
View Code

 

codeforces Upgrading Array