时间限制:3000 ms | 内存限制:65535 KB
难度:5
- 描述
-
在那遥远的地方有一片神奇的森林,它的神奇之处是:森林中的每棵树都长在一对整数确定的坐标上。有一个小红人站在(0,0)的位置上,放眼望去,看到很多的树,眼前的树是那么的多,以至于它一直数不清。那么就来写个程序帮它数数吧!
- 输入
- 第一行一个整数n,代表测试数据组数。
接下来有n(n<=20)行数,每行数有两个整数i,j代表任何的(x,y)(0<x<=i<=100000,0<y<j<=100000)的整数坐标上都有一棵树。
小红人始终是站在(0,0) 点上看树的。 - 输出
- 输出小红人看到的树的个数。每个结果占一行。
- 样例输入
-
1 7 4
- 样例输出
-
20
View Code1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #define Max 100001
5 using namespace std;
6 int prime[10000];
7 bool isprime[Max];
8 int cont=0;
9 void prm()
10 {
11 int i,j;
12 for(i=0;i<Max;i++) isprime[i]=true;
13
14 for(i=2;i<Max;i++)
15 {
16 if(isprime[i])
17 {
18 prime[cont++]=i;
19 for(j=2*i;j<Max;j+=i) isprime[j]=false;
20 }
21 }
22 }
23 int main()
24 {
25 int t,T;
26 int i,k,j,p,q,r,totle;
27 long long n,m,ans;
28 int index[10];
29 prm();
30 cin>>T;
31 while(T--)
32 {
33 cin>>n>>m;
34 //scanf("%lld%lld",&n,&m);
35 ans=n*m;
36 for(i=2;i<=n;i++)
37 {
38 if(isprime[i]) {ans-=m/i;continue;}
39 k=0;
40 for(j=0,t=i;prime[j]<=sqrt(i);j++)
41 {
42 if(t%prime[j]==0)
43 {
44 index[k++]=prime[j];
45
46 while(t%prime[j]==0) t/=prime[j];
47 if(t==1) break;
48 if(isprime[t]) {index[k++]=t;break;}
49 }
50 }
51 if(k==1) {ans-=m/index[0];continue;}
52 if(k==2) {ans-=( m/index[0]+m/index[1]-m/(index[0]*index[1]) );continue;}
53 if(k==3)
54 {
55 totle=1;
56 for(p=0;p<k;p++) ans-=m/index[p],totle*=index[p];///1
57 for(p=0;p<k;p++) ans+=m/(totle/index[p]);///2
58 ans-=m/totle;////3
59 continue;
60 }
61 if(k==4)
62 {
63 totle=1;
64 for(p=0;p<k;p++) {ans-=m/index[p];totle*=index[p];}////1
65
66 for(p=0;p<k;p++)///2ºÍ3
67 {
68 for(q=p+1;q<k;q++)
69 {
70 ans+=m/( index[p]*index[q] );///2
71 }
72 }
73 for(p=0;p<k;p++) ans-=m/(totle/index[p]);////3
74 ans+=m/totle;///4
75 continue;
76 }
77 if(k==5)
78 {
79 totle=1;
80 for(p=0;p<k;p++) ans-=m/index[p],totle*=index[p];////1
81
82 for(p=0;p<k;p++)///2///3
83 {
84 for(q=p+1;q<k;q++)
85 {
86 ans+=m/( index[p]*index[q] );////2
87 ans-=m/(totle/(index[p]*index[q]));/////3
88 }
89 }
90 for(p=0;p<k;p++) ans+=m/(totle/index[p]);///4
91 ans-=m/totle;////5
92 continue;
93 }
94 if(k==6)
95 {
96 totle=1;
97 for(p=0;p<k;p++) ans-=m/index[p],totle*=index[p];///1
98
99 for(p=0;p<k;p++)//2
100 {
101 for(q=p+1;q<k;q++)
102 {
103 ans+=m/( index[p]*index[q] );////2
104 ans+=m/(totle/(index[p]*index[q]));////4
105 }
106 }
107
108 for(p=0;p<k;p++)///3
109 {
110 for(q=p+1;q<k;q++)
111 for(r=q+1;r<k;r++)
112 ans-=m/( index[p]*index[q]*index[r] );
113 }
114 for(p=0;p<k;p++) ans-=m/(totle/index[p]);///5
115 ans+=m/totle;///6
116 continue;
117 }
118 }
119 //printf("%lld\n",ans);
120 cout<<ans<<endl;
121 }
122
123 return 0;
124 }