记录编号 29854 评测结果 AAAAAAAAAA
题目名称 [HAOI 2011]问题B 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 6.109 s
提交时间 2011-10-26 11:44:25 内存使用 2.43 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cmath>
  3. #define maxn 50000 + 10
  4.  
  5. int p[maxn] = {0};
  6. int f1[maxn] = {0},f2[maxn] = {0};
  7.  
  8. inline void pre()
  9. {
  10. int i,j,t;
  11. for( i = 1 ; i <= 50000 ; ++i )
  12. {
  13. p[i] = 1;
  14. for( j = 2, t = i ; j*j <= t && p[i] ; ++j )
  15. if( !(t % j) )
  16. {
  17. t /= j;
  18. p[i] = -p[i];
  19. if( !(t % j) )
  20. p[i] = 0;
  21. }
  22. if( t > 1 ) p[i] = -p[i];
  23. }
  24. for( i = 2 ; i <= 50000 ; ++i )
  25. p[i] += p[i-1];
  26. }
  27.  
  28. inline int calc( int a, int b, int d )
  29. {
  30. int i,j,t;
  31. a /= d, b /= d;
  32. f1[0] = (int)sqrt(a) * 2;
  33. for( i = 1 ; i*i <= a ; ++i )
  34. {
  35. f1[i] = i;
  36. f1[f1[0]+1-i] = a/i;
  37. }
  38. f2[0] = (int)sqrt(b) * 2;
  39. for( i = 1 ; i*i <= b ; ++i )
  40. {
  41. f2[i] = i;
  42. f2[f2[0]+1-i] = b/i;
  43. }
  44. int ans = 0;
  45. for( i = 1, j = 1, t = 0 ; i <= f1[0] || j <= f2[0] ; )
  46. {
  47. if( i <= f1[0] && ( j > f2[0] || f1[i] < f2[j] ) )
  48. {
  49. ans += (p[f1[i]]-p[t])*(a/f1[i])*(b/f1[i]);
  50. t = f1[i++];
  51. }
  52. else
  53. {
  54. ans += (p[f2[j]]-p[t])*(a/f2[j])*(b/f2[j]);
  55. t = f2[j++];
  56. }
  57. }
  58. return ans;
  59. }
  60.  
  61. int main()
  62. {
  63. int T,Test;
  64. int a,b,c,d,k;
  65. FILE *fp,*fo;
  66. fp = fopen("b.in","r");
  67. fo = fopen("b.out","w");
  68. pre();
  69. fscanf(fp,"%d",&Test);
  70. for( T = 1 ; T <= Test ; ++T )
  71. {
  72. fscanf(fp,"%d%d%d%d%d",&a,&b,&c,&d,&k);
  73. fprintf(fo,"%d\n",calc(b,d,k)-calc(b,c-1,k)-calc(a-1,d,k)+calc(a-1,c-1,k));
  74. }
  75. fclose(fp);
  76. fclose(fo);
  77. return 0;
  78. }