• 好多的树


    时间限制: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 }
  • 相关阅读:
    今日遇到一问题,甚是定奇怪,我将文件名称改为小写,系统便能载入上,但为何这样呢?
    CCCardinalSplineBy概念
    Java基本开发环境搭建
    Webserver推送技术
    十一招解决:系统IE部分网页打不开怎么办(转载)
    UIControl-IOS开发
    Sublime Text 2 介紹
    java的System.getProperty()方法能够获取的值
    IBinder对象在进程间传递的形式(一)
    cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2382049.html
Copyright © 2020-2023  润新知