CSU1602: Needle Throwing Game(投针问题)

Description

There are many parallel lines on the ground with the distance of D between each adjacent two. Now, throwing a needle randomly on the ground,please calculate the possibility of that the needle can be across one of the lines.

CSU1602: Needle Throwing Game(投针问题)_第1张图片

Input

The input consists of multiple test cases. Each test case contains 2 integers D, L on a single line (1 <= D, L <= 100). The input is ended with EOF.

Output

For each test case, print an integer of (int)(P*10000) where P is the possibility asked above. For example, when P = 0.25658,you should output 2565.

Sample Input

4 2
2 4

Sample Output

3183
8372

HINT

Source


裸的投针问题,不知道的童鞋可以自己百度,直接公式。。。
对于这种公式题,知道公式与不知道的差别瞬间就体现出来了

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define ls 2*i
#define rs 2*i+1
#define up(i,x,y) for(i=x;i<=y;i++)
#define down(i,x,y) for(i=x;i>=y;i--)
#define mem(a,x) memset(a,x,sizeof(a))
#define w(a) while(a)
#define LL long long
const double PI = acos(-1.0);
#define Len 200005
#define mod 19999997
const int INF = 0x3f3f3f3f;
#define exp 1e-8

int main()
{
    double L,D;
    double P;
    w(~scanf("%lf%lf",&D,&L))
    {
        if(L<D) P=2*L/(PI*D);
        else P=1+(2.0/PI)*((L*1.0/D)*(1-sqrt((1-(D*D)/(L*L))))-asin(D*1.0/L));
        P=P*10000;
        printf("%d\n",(int)P);
    }
    return 0;
}



你可能感兴趣的:(数学,CSU)