[关闭]
@ysner 2018-10-09T14:04:24.000000Z 字数 1444 阅读 1589

AT2004 Anticube

数论 贪心


题面

给定个数,要求从中选出最多的数,满足任意两个数之积都不是完全立方数。

解析

很显然的是,完全平方数的所有质因子指数都是的倍数。
考虑质因数分解。
我们可以把每个数质因数分解,所有大于的指数模不影响答案。
然后维护一下该数在处理后的值,和对应的能与其凑成完全平方数的值
不能共存。
于是我们存一下的出现次数,最后对于每个数贪心取中出现次数更多的那个即可。
注意取过的数不要再取,时只能取一个。

好了问题来了,质因数分解的复杂度不太对。
有一个显而易见的结论,中大于的因子至多只有个。
于是复杂度就对了?不虚,时限

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<map>
  8. #define ll long long
  9. #define re register
  10. #define il inline
  11. #define fp(i,a,b) for(re int i=a;i<=b;++i)
  12. #define fq(i,a,b) for(re int i=a;i>=b;--i)
  13. using namespace std;
  14. const int N=1e5+100;
  15. ll n,a[N],pri[N],tot,l[N],r[N],ans;
  16. map<ll,int>num,use;
  17. bool vis[N];
  18. il ll gi()
  19. {
  20. re ll x=0,t=1;
  21. re char ch=getchar();
  22. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  23. if(ch=='-') t=-1,ch=getchar();
  24. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  25. return x*t;
  26. }
  27. il void Pre(re int n)
  28. {
  29. vis[1]=1;
  30. fp(i,2,n)
  31. {
  32. if(!vis[i]) pri[++tot]=i;
  33. for(re int j=1;j<=tot&&i*pri[j]<=n;++j)
  34. {
  35. vis[i*pri[j]]=1;
  36. if(i%pri[j]==0) break;
  37. }
  38. }
  39. }
  40. il void split(re ll x,re int p)
  41. {
  42. re ll A=1,B=1;
  43. fp(i,1,tot)
  44. {
  45. re int gu=0;
  46. while(x%pri[i]==0)
  47. {
  48. x/=pri[i];++gu;
  49. }
  50. gu%=3;
  51. if(gu==1) B=B*pri[i]*pri[i];
  52. if(gu==2) A=A*pri[i]*pri[i],B=B*pri[i];
  53. if(x<pri[i]) break;
  54. }
  55. if(x>1)
  56. {
  57. re ll t=sqrt(x);
  58. if(t*t==x) A=A*x,B=B*t;
  59. else A=A*x,B=B*x*x;
  60. }
  61. l[p]=A;r[p]=B;
  62. ++num[A];
  63. }
  64. int main()
  65. {
  66. Pre(4000);
  67. n=gi();
  68. fp(i,1,n) a[i]=gi(),split(a[i],i);
  69. fp(i,1,n)
  70. if(!use[l[i]])
  71. {
  72. use[l[i]]=use[r[i]]=1;
  73. if(l[i]==r[i]) ++ans;
  74. else ans+=max(num[l[i]],num[r[i]]);
  75. }
  76. printf("%lld\n",ans);
  77. return 0;
  78. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注