Problem: There is a game called Sim Forest 2013. In this game, the player can become a forest god and raise forest animals.

Animals hatch from eggs and breed. When certain conditions are met, eggs are mutated with a certain probability to give birth to new races of animals.

There is an animal encyclopedia in this game, and when you get a new kind of animal, it will be recorded in the animal dictionary.

Mori is an enthusiastic player of Sim Forest 2013. His animal dictionary is complete when the remaining one race is filled.

Mori decided to obtain this remaining one race by mutation from the egg.

The game progress is as follows.

* N eggs will appear at the beginning of the stage.
* N eggs hatch s minutes after the start of the stage.
* Each egg has a 1 / p chance of targeting on a specific day of the week and within a specific time zone during the entire period * from appearance to hatching * (including the time of appearance and the moment of hatching). Mutates in animals.
* The stage ends t minutes after the start of the stage, and the same stage starts immediately after that (starts with n eggs. The elapsed time is not reset).
* The stage is repeated m times in a row.



This game meets the following specifications.

* Animals born from eggs do not lay eggs.
* Eggs hatch only once per stage, s minutes after the start of the stage.
* Mr. Sori can set the start day and start time of the first stage as desired. (The start time of the second and subsequent stages will be immediately after the end of the previous stage)
* One of {all days, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} is given as a mutable day.
* One of {all time zones, morning, night} is given as a mutable time zone.



Inputs are s, n, t, mutable day / time zone, p, m. Find the probability when you set the start day and start time of the first stage so that the probability of mutation occurring by the end of all stages is maximized.

Input

The input consists of multiple datasets. Each dataset is given in the following format:


s n t weekday time p m


Each dataset shows the time it takes for an egg to hatch from the start of the stage s, the number of eggs that appear at the start of the stage n, the time it takes to finish one stage t, the mutable day weekday, the mutable Time zone time, reciprocal of mutation probability p (mutation probability is 1 / p), total number of stages m.

The input satisfies the following constraints.

* 0 <s <= 500
* 0 <n <= 100
* s <t <= 1000
* weekday ∈ {All, Sun, Mon, Tue, Wed, Thu, Fri, Sat}
* All means all days of the week
* time ∈ {All, Day, Night}
* All means [0: 00 ~ 24: 00), Day means [6: 00 ~ 18: 00), and Night means [18: 00 ~ 6: 00).
* 1 <= p <= 99999
* 1 <= m <= 100



The end of the input is given on the following line.


0 0 0 None None 0 0


Output

For each dataset, output the probability when the start day and start time of the first stage is set so that the probability of mutation occurring by the end of all stages is maximized. The error in the answer must not exceed 0.00000001 (10-8). Any number of digits after the decimal point may be output as long as the precision conditions are met.

Sample Input


1 1 3 All All 1 1
2 37 5 All Night 150 1
16 2 20 All Day 5 10
1 14 15 Mon All 20000 100
0 0 0 None None 0 0


Output for Sample Input


1.0000000000
0.2192439716
0.9884707850
0.0649933899






Example

Input

1 1 3 All All 1 1
2 37 5 All Night 150 1
16 2 20 All Day 5 10
1 14 15 Mon All 20000 100
0 0 0 None None 0 0


Output

1.0000000000
0.2192439716
0.9884707850
0.0649933899

Solution (in JAVA):

Solution:
import java.util.*;

public class Main{
	static boolean[] list;
	static HashMap<String,Integer> daylist;
	static ArrayList<String> name;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while (true) {
			int s = sc.nextInt();
			int n = sc.nextInt();
			int t = sc.nextInt();
			String week = sc.next();
			String time = sc.next();
			int p = sc.nextInt();
			int m = sc.nextInt();

			list=new boolean[7*24*60+1];
			
			for(int e=0;e<list.length;e++)list[e]=false;
			
			daylist=new HashMap<String,Integer>();
			name=new ArrayList<String>();
			name.add("Sun");
			daylist.put(name.get(0), 0);
			
			name.add("Mon");
			daylist.put(name.get(1), 1*24*60);
			
			name.add("Tue");
			daylist.put(name.get(2), 2*24*60);
		
			name.add("Wed");
			daylist.put(name.get(3), 3*24*60);
			
			name.add("Thu");
			daylist.put(name.get(4), 4*24*60);
			
			name.add("Fri");
			daylist.put(name.get(5), 5*24*60);
			
			name.add("Sat");
			daylist.put(name.get(6), 6*24*60);		
			
			if (s == 0 && n == 0 && t == 0 && p == 0 && m == 0 && week.equals("None") && time.equals("None"))break;		
					
			if(week.equals("All"))set(time);
			else set(week,time);
			
			if(list[0]||list[10080]){
				list[0]=true;
				list[10080]=true;
			}
			int aroundable=0;
			
			int ii=0;
			while(true){
				int count=0;	
				int here=ii;

				

				for(int j=0;j<m;j++){
					int sub=here+s;
					if(list[here]&&check(here,sub))count++;
					here+=t;
					if(here>=10080)here-=10080;
				}		
					aroundable=Math.max(aroundable, count);
			
				ii++;
				if(ii==7*24*60)break;
			}

	
			double result=1.0-(1.0/p);
			result=result==0?result=1:result;
			result=1-Math.pow(result,aroundable*n);
			result=result==0&&!(time.equals("Night")&&s>=360)?result=1:result;
	
			System.out.printf("%.10f\n",result);
	
		}
	}
	
	public static void set(String str){
		if(str.equals("Day")){
			for(int i=0;i<daylist.size();i++)setset(daylist.get(name.get(i)),6,18);
		}
		else if(str.equals("Night")){
			for(int i=0;i<daylist.size();i++){
				setset(daylist.get(name.get(i)),0,6);
				setset(daylist.get(name.get(i)),18,24);
			}
		}else for(int i=0;i<daylist.size();i++)setset(daylist.get(name.get(i)),0,24);
		
	}
	public static void set(String strw,String strt){
		if(strt.equals("Day"))setset(daylist.get(strw),6,18);
		else if(strt.equals("Night")){

			setset(daylist.get(strw),0,6);
			setset(daylist.get(strw),18,24);
		}else setset(daylist.get(strw),0,24);
	}
	public static void setset(int num,int start,int end){
		
		if(start==0&&end==24){
			start=num;
			end=start+1440;
		}else if(start==0&&end==6){
			start=num;
			end=start+360;
		}else if(start==18&&end==24){
			start=num+1080;
			end=start+360;
		}else if(start==6&&end==18){
			start=num+360;
			end=start+720;
		}
		
		for(int i=start;i<end;i++)list[i]=true;			
	
	}
	public static boolean check(int start,int end){
	
		
		if(end<=10080){
			for(int i=start;i<=end;i++){
				if(!list[i])return false;
			}
	
		}else {
			end-=10080;
			for(int i=start;i<=10080;i++){
				if(!list[i])return false;
			}for(int i=0;i<=end;i++){
				if(!list[i])return false;
			}
	
		}
		
		return true;
	}
}