#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
typedef pair<double, double> pd;
const int maxn = 1e5 + 5;
double pi = acos(-1.0), eps = 1e-8;
struct POINT{
double x, y, r;
double dist(){
return x * x + y * y;
}
double angel(){
double a = atan2(y, x);
if(a < -eps) a += 2 * pi;
return a;
}
}p[maxn];
int main (void)
{
double x0, y0, V, T;
int n;
scanf("%lf%lf%lf%lf%d", &x0, &y0, &V, &T, &n);
double x, y, r;
double mx = T * V;
for(int i = 0; i < n; i++){
scanf("%lf%lf%lf", &x, &y, &r);
x -= x0; y -=y0;
p[i] = (POINT){x, y, r};
}
vector<pd>v;
for(int i = 0; i < n; i++){
if(p[i].dist() - p[i].r * p[i].r < eps) return printf("1.000000000\n"), 0;
if(sqrt(p[i].dist()) - eps > p[i].r + mx) continue;
double d1 = min(sqrt(p[i].dist() - p[i].r * p[i].r), mx);
double b = acos((p[i].dist() + d1 * d1 - p[i].r * p[i].r) / (2.0 * sqrt(p[i].dist()) * d1));
double a = p[i].angel();
if(a + b - eps > 2 * pi){
v.push_back(pd(a - b, 2 * pi));
v.push_back(pd(0, a + b - 2 * pi));
}else if(a - b < -eps){
v.push_back(pd(0, a + b));
v.push_back(pd(a - b + 2 * pi, 2 * pi));
}else{
v.push_back(pd(a - b, a + b));
}
}
if(!v.size()) return printf("0.000000000\n"), 0;
sort(v.begin(), v.end());
double ans = 0.0;
double l = v[0].first;
r = v[0].second;
int sz = v.size();
for(int i = 1; i < sz; i++){
if(v[i].first + eps > r){
ans += r - l;
l = v[i].first;
}
if(v[i].second + eps > r){
r = v[i].second;
}
}
ans += r - l;
printf("%.10f\n", ans / (2.0 * pi));
return 0;
}