记录编号 |
29854 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2011]问题B |
最终得分 |
100 |
用户昵称 |
Makazeu |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
6.109 s |
提交时间 |
2011-10-26 11:44:25 |
内存使用 |
2.43 MiB |
显示代码纯文本
- #include <cstdio>
- #include <cmath>
- #define maxn 50000 + 10
-
- int p[maxn] = {0};
- int f1[maxn] = {0},f2[maxn] = {0};
-
- inline void pre()
- {
- int i,j,t;
- for( i = 1 ; i <= 50000 ; ++i )
- {
- p[i] = 1;
- for( j = 2, t = i ; j*j <= t && p[i] ; ++j )
- if( !(t % j) )
- {
- t /= j;
- p[i] = -p[i];
- if( !(t % j) )
- p[i] = 0;
- }
- if( t > 1 ) p[i] = -p[i];
- }
- for( i = 2 ; i <= 50000 ; ++i )
- p[i] += p[i-1];
- }
-
- inline int calc( int a, int b, int d )
- {
- int i,j,t;
- a /= d, b /= d;
-
- f1[0] = (int)sqrt(a) * 2;
- for( i = 1 ; i*i <= a ; ++i )
- {
- f1[i] = i;
- f1[f1[0]+1-i] = a/i;
- }
- f2[0] = (int)sqrt(b) * 2;
- for( i = 1 ; i*i <= b ; ++i )
- {
- f2[i] = i;
- f2[f2[0]+1-i] = b/i;
- }
-
- int ans = 0;
- for( i = 1, j = 1, t = 0 ; i <= f1[0] || j <= f2[0] ; )
- {
- if( i <= f1[0] && ( j > f2[0] || f1[i] < f2[j] ) )
- {
- ans += (p[f1[i]]-p[t])*(a/f1[i])*(b/f1[i]);
- t = f1[i++];
- }
- else
- {
- ans += (p[f2[j]]-p[t])*(a/f2[j])*(b/f2[j]);
- t = f2[j++];
- }
- }
- return ans;
- }
-
- int main()
- {
- int T,Test;
- int a,b,c,d,k;
-
- FILE *fp,*fo;
- fp = fopen("b.in","r");
- fo = fopen("b.out","w");
-
- pre();
- fscanf(fp,"%d",&Test);
- for( T = 1 ; T <= Test ; ++T )
- {
- fscanf(fp,"%d%d%d%d%d",&a,&b,&c,&d,&k);
- fprintf(fo,"%d\n",calc(b,d,k)-calc(b,c-1,k)-calc(a-1,d,k)+calc(a-1,c-1,k));
- }
-
- fclose(fp);
- fclose(fo);
- return 0;
- }