[zoj]3576 Count the Length

这题很水,找规律就能过...
1。先考虑如果m,n至少有一个是偶数,根据对称性,答案就是对角线长的一半
2。然后m,n都是奇数的情况,画一下3X5,3X7的看一下,规律一眼就看出来了...- -
    先同除以最大公约数,然后根据刚刚找到的规律(假设m>n,根据三角形相似,答案与对角线的比例=n/m+(n-2)/m+..+3/m+1/m+1/m+3/m+...+(n-2)/m+n/m,如果不足
    (m+n)/2项的话,差多少个就加多少个n/m补足)可以推出答案是对角线长度(m*n+1)/(2*m*n)倍

View Code
 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<math.h>
4 long long gcd(long long x,long long y)
5 {
6 long r;
7 r=x%y;
8 while(r!=0)
9 {
10 x=y;
11 y=r;
12 r=x%y;
13 }
14 return y;
15 }
16 int main()
17 {
18 long long n,m,g,num,temp;
19 double ans;
20 while(scanf("%lld%lld",&n,&m)!=EOF)
21 {
22 //if(m==n){ans=sqrt(m*m+n*n);printf("%.3lf\n",ans);continue;}
23 if(n%2==0||m%2==0){ans=sqrt(m*m+n*n)/2;printf("%.3lf\n",ans);continue;}
24 if(m<n){temp=m;m=n;n=temp;}
25 g=gcd(n,m);
26 n/=g;
27 m/=g;
28 ans=(double)(m*n+1)/(2*m*n);
29 ans=ans*g*sqrt(m*m+n*n);
30 printf("%.3lf\n",ans);
31 }
32 return 0;
33 }
posted @ 2012-02-27 17:40  ustc-acm  阅读(424)  评论(0编辑  收藏  举报