您的位置:首页 > 数据库

ZJU2012.02月赛 F题(ZOJ 3576)

2012-03-02 19:27 387 查看
水题一枚……可惜比赛的时候想多了,最后想到用级数之类的来求……

实际上找规律就能过,比赛的时候赶时间没好好画图没看出来,今天上数据库课太无聊又多画了几个图就看出来了……

先把m,n除去最大公约数

如果m,n中有任一个为偶数那么一定能找到某种对称方式,所以红色的长度就是对角线长度的一半

如果两者都是奇数,那么红色长度与对角线的比例就是n/m + (n-2)/m + ... + 3/m + 1/m + 3/m + ... + (n-2) /m + n / m(如果不足(n+m)/2项就用n/m补足),化简成(n*m+1) / (2*m*n)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>

using namespace std;

int m, n;

int gcd(int a, int b)
{
return b ? gcd(b, a%b) : a;
}

int main()
{
while(~scanf("%d%d", &m, &n))
{
if(m == n)
{
printf("%.3lf\n", sqrt(double(m)*double(m) + double(m)*double(m)));
}
int t = gcd(m, n);
m /= t;
n /= t;
if(m % 2 == 0 || n % 2 == 0)
{
printf("%.3lf\n", sqrt(double(m)*double(m) + double(n)*double(n)) / 2 * double(t));
}
else
{
int i;
double sum = 0;
double tmp1, tmp2, t1, t2;
if(m > n) swap(m, n);
sum = double(m*n + 1) / double(2*m*n) * (sqrt(double(m)*double(m) + double(n)*double(n)));
printf("%.3lf\n", sum * (double)t);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库