好多的树
时间限制: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 Code 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 }
 
                    
                
 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号