记录编号 417057 评测结果 AAAAAAAAAAA
题目名称 [河南省队2016]HH树 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 3.632 s
提交时间 2017-06-23 22:15:49 内存使用 14.46 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. const int N=5e4+10;
  6. int n,q,blo,a[N],u[N],p[N],F[N],now,cnt;
  7. bool isp[N];
  8. int que[N][65],num[N];
  9. struct opt{int l,r,id;}Q[N];
  10. int ans[N];
  11. bool cmp(const opt &x,const opt &y){
  12. return x.l/blo==y.l/blo?x.r<y.r:x.l/blo<y.l/blo;
  13. }
  14. void push(int x){
  15. for (register int i=num[x],d;i;--i){
  16. d=que[x][i];
  17. now+=F[d]*u[d];
  18. F[d]++;
  19. }
  20. }
  21. void del(int x){
  22. for (register int i=num[x],d;i;--i){
  23. d=que[x][i];
  24. F[d]--;
  25. now-=F[d]*u[d];
  26. }
  27. }
  28. void init(){
  29. u[1]=1;
  30. for (int i=2;i<=5e4;i++){
  31. if (!isp[i]) isp[i]=1,p[++cnt]=i,u[i]=-1;
  32. for (int j=1;j<=cnt&&i*p[j]<=5e4;j++){
  33. int x=i*p[j];isp[x]=1;
  34. if (i%p[j]) u[x]=-u[i];
  35. else{u[x]=0;break;}
  36. }
  37. }
  38. for (int i=1;i<=5e4;i++)
  39. for (int j=i;j<=5e4;j+=i)
  40. if (u[i]) que[j][++num[j]]=i;
  41. }
  42. int main()
  43. {
  44. freopen("hhtree.in","r",stdin);
  45. freopen("hhtree.out","w",stdout);
  46. init();
  47. scanf("%d%d",&n,&q);
  48. blo=sqrt(n);
  49. for (int i=1;i<=n;i++) scanf("%d",&a[i]);
  50. for (int i=1;i<=q;i++)
  51. scanf("%d%d",&Q[i].l,&Q[i].r),Q[i].id=i;
  52. sort(Q+1,Q+q+1,cmp);
  53. int l=Q[1].l,r=l-1;
  54. for (int i=1;i<=q;i++){
  55. while (r<Q[i].r) push(a[++r]);
  56. while (l>Q[i].l) push(a[--l]);
  57. while (r>Q[i].r) del(a[r--]);
  58. while (l<Q[i].l) del(a[l++]);
  59. ans[Q[i].id]=now;
  60. }
  61. for (int i=1;i<=q;i++) printf("%d\n",ans[i]);
  62. return 0;
  63. }