• 好多的树


    时间限制: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
      1 #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 }
  • 相关阅读:
    HDU 1301 Jungle Roads
    HDU 1671 Phone List
    HDU 1992 Tiling a Grid With Dominoes
    HDU 1251 统计难题
    总结自己的近期表现
    Windows API 函数: SetClassLong
    ModifyStyle
    assert,assert_valid,verify,trace用法
    用VC++绘制位图按钮
    Codeforces 144D. Missile Silos 最短路
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2382049.html
Copyright © 2020-2023  润新知