Problem:
次のようなゲームを考える． 1 から n までの数が 1 つずつ書かれた n 枚のカードが k 組ある．これら kn 枚のカードをよくシャッフル（よく切ること）して， k 枚ずつの山を作り横一列に並べる．このようにしてできる n 個の山の左から i 番目の（k 枚のカードの）山を「山 i 」と呼ぶことにする．
ゲームは山 1 から始める．山の一番上のカード 1 枚を引き（引いたカードは元の山に戻さない），そのカードに書かれていた数が i だった場合には山 i の一番上のカード 1 枚を引く．このようにして，引いたカードに書かれていた数を番号とする山の一番上のカード 1 枚を引くことを繰り返し，すべての山にカードが無くなれば成功である．まだカードが残っている山があるのに，次にカードを引くべき山が無くなっていた場合は失敗である．
途中で失敗した場合には，そのまま失敗で終了するか，または残ったカードの山をそのまま（山の番号もそのまま）にしてゲームを再開する．ゲームを再開する場合は，最初に引くカードはカードが残っている山のうちの一番左の山からとする（その山の一番上のカードが最初に引かれるカードとなる）．再開後も再開前と同様の方法でゲームを進め，すべての山にカードが無くなれば成功であり，まだカードが残っている山があるのに，次にカードを引くべき山が無くなった場合は失敗である．
このようなゲームの再開を最大 m 回まで行うものとする．ただし，m は 0 か 1 である．つまり， 1 回も再開しないか， 1 回だけ再開するかのいずれかである．ゲーム開始前のシャッフルの仕方によりカードの初期配置は異なる．当然，カードの初期配置により，再開せずに成功することもあれば，再開して成功することも，再開して失敗することもある．十分シャッフルしているので，どの初期配置も全て同じ確率で現れるものと考えることにして，再開が m 回以内で成功する確率 p を求めたい．この確率 p を小数で表し，小数第 r 位まで求めて出力するプログラムを作りなさい．ただし，次の条件を満たすように出力すること.
十分大きい正整数 K を取ると p×10K が 整数となる場合， 小数部は途中から 0 が続くが，その 0 も出力すること． 例えば， p = 3/8 = 0.375 の場合， r = 5 なら 0.37500 と出力し， r = 2 なら 0.37 と出力する． p = 1.0 の場合も同様に， 例えば r = 3 なら 1.000 と出力すること．
例えば 0.150000… は循環小数 0.1499999… として表すこともできるが， このような場合， 前者の表し方を用いる．
入力ファイルの 1 行目には整数 n，k，m，r がこの順に空白を区切り文字として書いてある． 1 ≦ n ≦ 10000， 1 ≦ k ≦ 100， m = 0 または m = 1， 1 ≦ r ≦ 10000 である．
入力例１
入力例２
入力例３
2 1 0 5
3 1 1 3
2 2 1 3
出力例１
出力例２
出力例３
0.50000
0.833
1.000
入力
入力は複数のデータセットからなる．n, k, m, r がすべて 0 のとき入力が終了する．データセットの数は 5 を超えない．
出力
データセットごとに、指定通りに p を１行に出力する．
入力例
2 1 0 5
3 1 1 3
2 2 1 3
0 0 0 0
出力例
0.50000
0.833
1.000
各データセットについて，指定通りに出力した p の後に改行を入れること．
上記問題文と自動審判に使われるデータは、
情報オリンピック日本委員会
が作成し公開している問題文と採点用テストデータです。

Submitted solutions:

code_snippet: #pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) {
    return (ull)rng() % B;
}
inline double time() {
    return static_cast<long double>(chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now().time_since_epoch()).count()) * 1e-9;
}

int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n,k,m,r;
    while (cin >> n >> k >> m >> r, n+m+k+r) {
        const int N = 10010;
        vector<int> a(N),b(N);

        auto add = [&](int x) -> void {
            int cur = 1;
            for (int i = 1; i < N; i++) {
                cur *= 10;
                b[i] = cur/x;
                cur %= x;
            }
            for (int i = N-1; i >= 0; i--) {
                a[i] += b[i];
                if (a[i] >= 10) {
                    a[i-1]++;
                    a[i] -= 10;
                }
            }
        };

        add(n);
        if (m == 1) {
            for (int i = 1; i <= n-1; i++) {
                add(n*i);
            }
        }
        cout << a[0] << ".";
        for (int i = 1; i <= r; i++) {
            cout << a[i];
        }
        cout << "\n";
    } 
}
accuracy: 1
time_ms: 1190
memory_kb: 3416
final_rank: 19

code_snippet: #include <iostream>
using namespace std;
int n, m, a, b, p[30000];
int main() {
  while (true) {
    cin >> n >> m >> a >> b;
    if (n == 0)
      break;
    for (int i = 0; i < 30000; i++)
      p[i] = 0;
    int L = 10, R = n;
    for (int i = 0; i < 30000; i++) {
      p[i] += L / R;
      L = L % R;
      L *= 10;
    }
    if (a == 1) {
      for (int i = 1; i < n; i++) {
        int L = 10, R = i * n;
        for (int j = 0; j < 30000; j++) {
          p[j] += L / R;
          L = L % R;
          L *= 10;
        }
      }
    }
    for (int i = 29999; i > 0; i--) {
      p[i - 1] += p[i] / 10;
      p[i] %= 10;
    }
    p[0] %= 10;
    if (n - a < 2)
      cout << "1.";
    else
      cout << "0.";
    for (int i = 0; i < b; i++)
      cout << p[i];
    cout << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 2510
memory_kb: 3204
final_rank: 18

code_snippet: #include <iostream>
using namespace std;
int a[100000], n, k, m, r;
void Div(int l, int s) {
  int p = l * 10, q = s;
  for (int i = 0; i < r + 10; i++) {
    a[i] += p / q;
    p = p % q;
    p *= 10;
  }
  for (int i = r + 10; i >= 1; i--) {
    if (a[i] >= 10) {
      a[i - 1] += a[i] / 10;
      a[i] %= 10;
    }
  }
}
int main() {
  while (true) {
    for (int i = 0; i < 10200; i++)
      a[i] = 0;
    cin >> n >> k >> m >> r;
    if (n == 0)
      break;
    Div(1, n);
    if (m == 1) {
      for (int i = 1; i < n; i++) {
        Div(1, n * i);
      }
    }
    cout << a[0] / 10 << '.';
    for (int i = 0; i < r; i++)
      cout << a[i] % 10;
    cout << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 1380
memory_kb: 3040
final_rank: 6

code_snippet: #include <iostream>
using namespace std;
int a[100000], n, k, m, r;
inline void Div(int l, int s) {
  int p = l * 10, q = s;
  for (int i = 0; i < r + 10; i++) {
    a[i] += p / q;
    p = p % q;
    p *= 10;
  }
}
int main() {
  while (true) {
    for (int i = 0; i < 10200; i++)
      a[i] = 0;
    cin >> n >> k >> m >> r;
    if (n == 0)
      break;
    Div(1, n);
    if (m == 1) {
      for (int i = 1; i < n; i++) {
        Div(1, n * i);
      }
    }
    for (int i = r + 10; i >= 1; i--) {
      if (a[i] >= 10) {
        a[i - 1] += a[i] / 10;
        a[i] %= 10;
      }
    }
    cout << a[0] / 10 << '.';
    for (int i = 0; i < r; i++)
      cout << a[i] % 10;
    cout << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 840
memory_kb: 3056
final_rank: 2

code_snippet: #include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
typedef vector<int> BigDecimal;
int n, k, m, r;
BigDecimal tmp(10010);
void Div(ll x) {
  ll now = 1LL;
  for (int i = 0; i < r + 10; i++) {
    tmp[i] = now / x;
    now %= x;
    now *= 10;
  }
}
void print(const BigDecimal &b) {
  cout << b[0] << ".";
  for (int i = 1; i <= r; i++)
    cout << b[i];
  cout << endl;
}
int main() {
  while (cin >> n >> k >> m >> r, n) {
    Div(n);
    BigDecimal res = tmp;
    if (m == 1) {
      for (ll i = 1; i < n; i++) {
        Div(i * n);
        for (int j = 0; j < r + 10; j++)
          res[j] += tmp[j];
      }
      for (int j = r + 10 - 1; j > 0; j--) {
        res[j - 1] += res[j] / 10;
        res[j] %= 10;
      }
    }
    print(res);
  }
}
accuracy: 1
time_ms: 1380
memory_kb: 3080
final_rank: 10

code_snippet: #include <iostream>
#include <vector>
using namespace std;
typedef vector<int> BigDecimal;
int n, k, m, r;
BigDecimal tmp(10010);
void Div(int x) {
  int now = 1;
  for (int i = 0; i < r + 10; i++) {
    tmp[i] = now / x;
    now %= x;
    now *= 10;
  }
}
void print(const BigDecimal &b) {
  cout << b[0] << ".";
  for (int i = 1; i <= r; i++)
    cout << b[i];
  cout << endl;
}
int main() {
  while (cin >> n >> k >> m >> r, n) {
    Div(n);
    BigDecimal res = tmp;
    if (m == 1) {
      for (int i = 1; i < n; i++) {
        Div(i * n);
        for (int j = 0; j < r + 10; j++)
          res[j] += tmp[j];
      }
      for (int j = r + 10 - 1; j > 0; j--) {
        res[j - 1] += res[j] / 10;
        res[j] %= 10;
      }
    }
    print(res);
  }
}
accuracy: 1
time_ms: 880
memory_kb: 3100
final_rank: 4

code_snippet: #include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
typedef vector<int> BigDecimal;
const int digit = 10010;
BigDecimal div(ll x) {
  ll now = 1LL;
  BigDecimal res;
  for (int i = 0; i < digit; i++) {
    res.push_back(now / x);
    now %= x;
    now *= 10;
  }
  return res;
}
void print(BigDecimal b, int len) {
  cout << b[0] << ".";
  for (int i = 1; i <= len; i++)
    cout << b[i];
  cout << endl;
}
int main() {
  int n, k, m, r;
  while (cin >> n >> k >> m >> r, n) {
    BigDecimal res = div(n);
    if (m == 1) {
      for (ll i = 1; i < n; i++) {
        BigDecimal tmp = div(i * n);
        for (int j = 0; j < digit; j++)
          res[j] += tmp[j];
      }
      for (int j = digit - 1; j > 0; j--) {
        res[j - 1] += res[j] / 10;
        res[j] %= 10;
      }
    }
    print(res, r);
  }
}
accuracy: 1
time_ms: 1920
memory_kb: 3188
final_rank: 15

code_snippet: #include <algorithm>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
#define REP(i, b, n) for (int i = b; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define pb push_back
typedef long long ll;
const int N = 20010;
int array[N], tmp[N];
void div(int n, int *a, int k) {
  int now = 1;
  rep(i, k + 1) {
    a[i] = now / n;
    now = (now % n) * 10;
  }
}
void add(int k) {
  int carry = 0;
  for (int i = k; i >= 0; i--) {
    array[i] = (array[i] + carry + tmp[i]);
    carry = array[i] / 10;
    array[i] %= 10;
  }
}
void output(int *a, int k) {
  rep(i, k + 1) {
    cout << a[i];
    if (i == 0)
      cout << ".";
  }
  cout << endl;
}
void solve(int n, int m, int k) {
  div(n, array, 2 * k);
  if (m == 1) {
    REP(i, 1, n) {
      div(i * n, tmp, 2 * k);
      add(2 * k);
    }
  }
  output(array, k);
}
main() {
  int n, k, m, r;
  while (cin >> n >> k >> m >> r && n) {
    solve(n, m, r);
  }
}
accuracy: 1
time_ms: 2170
memory_kb: 3160
final_rank: 17

code_snippet: #include <algorithm>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
#define REP(i, b, n) for (int i = b; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define pb push_back
typedef long long ll;
const int N = 20010;
int array[N], tmp[N];
void div(int n, int *a, int k) {
  int now = 1;
  rep(i, k + 1) {
    a[i] = now / n;
    now = (now % n) * 10;
  }
}
void add(int k) {
  int carry = 0;
  for (int i = k; i >= 0; i--) {
    array[i] = (array[i] + carry + tmp[i]);
    carry = array[i] / 10;
    array[i] %= 10;
  }
}
void output(int *a, int k) {
  rep(i, k + 1) {
    cout << a[i];
    if (i == 0)
      cout << ".";
  }
  cout << endl;
}
void solve(int n, int m, int k) {
  div(n, array, k + 6);
  if (m == 1) {
    REP(i, 1, n) {
      div(i * n, tmp, k + 6);
      add(k + 6);
    }
  }
  output(array, k);
}
main() {
  int n, k, m, r;
  while (cin >> n >> k >> m >> r && n) {
    solve(n, m, r);
  }
}
accuracy: 1
time_ms: 1080
memory_kb: 3172
final_rank: 12

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define fi first
#define se second
typedef pair<ll,ll> P;
using VP = vector<P>; using VVP = vector<VP>;
using VI = vector<ll>; using VVI = vector<VI>; using VVVI = vector<VVI>;
const int inf=1e9+7;
const ll INF=1LL<<61;
const ll mod=1e9+7;

template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

VI ans;

void calc(int s,int t){
    for(int i=0;i<10101;i++){
        ans[i]+=s/t;
        int u=i;
        while(ans[u]>=10) {
            ans[u-1]+=1;
            ans[u]-=10;
            u--;
        }
        s%=t;
        s*=10;
        if(s==0) return;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int i,j;
    int n,k,m,r;
    while(1){
    cin>>n>>k>>m>>r;
    if(n==0) break;
    ans = VI(10101);
    if(m==0) {
       calc(1,n);
    }
    else {
       calc(1,n);
       for(i=1;i<n;i++) calc(1,n*i);
    }
    //if(n==1) ans=1.0;
    //if(n==2&&m==1) ans=1.0;
    //if(k==1) ans=0;
    cout<<ans[0]<<".";
    for(i=1;i<=r;i++){
        cout<<ans[i];
    }
    cout<<endl;
    }
}
accuracy: 1
time_ms: 1690
memory_kb: 3224
final_rank: 16

code_snippet: #include <bits/stdc++.h>

//    #include <boost/multiprecision/cpp_int.hpp>
 #define int long long
 #define inf  1000000007
 #define pa pair<int,int>
 #define ll long long
 #define pal pair<double,double>
 #define ppap pair<pa,int>
//  #define PI 3.14159265358979323846
  #define paa pair<int,char>
  #define  mp make_pair
  #define  pb push_back
  #define EPS (1e-10)
                                          
    int dx[8]={0,-1,0,1,1,1,-1,-1};
    int dy[8]={1,0,-1,0,-1,1,1,-1};
                                            using namespace std;
                                   			class pa3{
                                            	public:
                                            	int x,y,z;
                                            	pa3(int x=0,int y=0,int z=0):x(x),y(y),z(z) {}
                                            	bool operator < (const pa3 &p) const{
                                            		if(x!=p.x) return x<p.x;
                                            		if(y!=p.y) return y<p.y;
                                            		 return z<p.z;
                                            		//return x != p.x ? x<p.x: y<p.y;
                                            	}
                                   				bool operator > (const pa3 &p) const{
                                            		if(x!=p.x) return x>p.x;
                                            		if(y!=p.y) return y>p.y;
                                            		 return z>p.z;
                                            		//return x != p.x ? x<p.x: y<p.y;
                                            	}
                                            	bool operator == (const pa3 &p) const{
                                            		return x==p.x && y==p.y && z==p.z;
                                            	}
                                            		bool operator != (const pa3 &p) const{
                                            			return !( x==p.x && y==p.y && z==p.z);
                                            	}
                                            
                                            };
                                            
                                            class pa4{
                                            	public:
                                            	double x;
                                            	int y,z,w;
                                            	pa4(double x=0,int y=0,int z=0,int w=0):x(x),y(y),z(z),w(w) {}
                                            	bool operator < (const pa4 &p) const{
                                            		if(x!=p.x) return x<p.x;
                                            		if(y!=p.y) return y<p.y;
                                            		if(z!=p.z)return z<p.z;
                                            		return w<p.w;
                                            		//return x != p.x ? x<p.x: y<p.y;
                                            	}
                                            	bool operator > (const pa4 &p) const{
                                            		if(x!=p.x) return x>p.x;
                                            		if(y!=p.y) return y>p.y;
                                            		if(z!=p.z)return z>p.z;
                                            		return w>p.w;
                                            		//return x != p.x ? x<p.x: y<p.y;
                                            	}
                                            	bool operator == (const pa4 &p) const{
                                            		return x==p.x && y==p.y && z==p.z &&w==p.w;
                                            	}
                                            		
                                            
                                            };
                                            class pa2{
                                            	public:
                                            	int x,y;
                                            	pa2(int x=0,int y=0):x(x),y(y) {}
                                            	pa2 operator + (pa2 p) {return pa2(x+p.x,y+p.y);}
                                            	pa2 operator - (pa2 p) {return pa2(x-p.x,y-p.y);}
                                            	bool operator < (const pa2 &p) const{
                                            		return y != p.y ? y<p.y: x<p.x;
                                            	}
                                            	bool operator > (const pa2 &p) const{
                                            		return x != p.x ? x<p.x: y<p.y;
                                            	}
                                            	bool operator == (const pa2 &p) const{
                                            		return abs(x-p.x)==0 && abs(y-p.y)==0;
                                            	}
                                            	bool operator != (const pa2 &p) const{
                                            		return !(abs(x-p.x)==0 && abs(y-p.y)==0);
                                            	}
                                            		
                                            
                                            };
                                            
/*
                                            class Point{
                                            	public:
                                            	double x,y;
                                            	Point(double x=0,double y=0):x(x),y(y) {}
                                            	Point operator + (Point p) {return Point(x+p.x,y+p.y);}
                                            	Point operator - (Point p) {return Point(x-p.x,y-p.y);}
                                            	Point operator * (double a) {return Point(x*a,y*a);}
                                            	Point operator / (double a) {return Point(x/a,y/a);}
                                            	double absv() {return sqrt(norm());}
                                            	double norm() {return x*x+y*y;}
                                            	bool operator < (const Point &p) const{
                                            		return x != p.x ? x<p.x: y<p.y;
                                            	}
                                            	bool operator == (const Point &p) const{
                                            		return fabs(x-p.x)<EPS && fabs(y-p.y)<EPS;
                                            	}
                                            };
                                            typedef Point Vector;
                                     #define pl pair<int,pas>
                                            struct Segment{
                                            Point p1,p2;
                                            };
                                             double dot(Vector a,Vector b){
                                            	return a.x*b.x+a.y*b.y;
                                            }
                                            double cross(Vector a,Vector b){
                                            	return a.x*b.y-a.y*b.x;
                                            }
                                        
                bool parareru(Point a,Point b,Point c,Point d){
                //	if(abs(cross(a-b,d-c))<EPS)cout<<"dd "<<cross(a-b,d-c)<<endl;
                	return abs(cross(a-b,d-c))<EPS;
                }
                double distance_ls_p(Point a, Point b, Point c) {
                  if ( dot(b-a, c-a) < EPS ) return (c-a).absv();
                  if ( dot(a-b, c-b) < EPS ) return (c-b).absv();
                  return abs(cross(b-a, c-a)) / (b-a).absv();
                }
                bool is_intersected_ls(Segment a,Segment b) {
                	if(a.p1==b.p1||a.p2==b.p1||a.p1==b.p2||a.p2==b.p2) return false;
                	if(parareru((a.p2),(a.p1),(a.p1),(b.p2))&&parareru((a.p2),(a.p1),(a.p1),(b.p1))){
                //		cout<<"sss"<<endl;
                		if(dot(a.p1-b.p1,a.p1-b.p2)<EPS) return true;
                		if(dot(a.p2-b.p1,a.p2-b.p2)<EPS) return true;
                		if(dot(a.p1-b.p1,a.p2-b.p1)<EPS) return true;
                		if(dot(a.p1-b.p2,a.p2-b.p2)<EPS) return true;
                		return false;
                	}
                  else return ( cross(a.p2-a.p1, b.p1-a.p1) * cross(a.p2-a.p1, b.p2-a.p1) < EPS ) && ( cross(b.p2-b.p1, a.p1-b.p1) * cross(b.p2-b.p1, a.p2-b.p1) < EPS );
                }
                 
                double segment_dis(Segment a,Segment b){
                	if(is_intersected_ls(a,b))return 0;
                	double r=distance_ls_p(a.p1, a.p2, b.p1);
                	r=min(r,distance_ls_p(a.p1, a.p2, b.p2));
                	r=min(r,distance_ls_p(b.p1, b.p2, a.p2));
                	r=min(r,distance_ls_p(b.p1, b.p2, a.p1));
                	return r;
                }
                Point intersection_ls(Segment a, Segment b) {
                  Point ba = b.p2-b.p1;
                  double d1 = abs(cross(ba, a.p1-b.p1));
                  double d2 = abs(cross(ba, a.p2-b.p1));
                  double t = d1 / (d1 + d2);
                 
                  return a.p1 + (a.p2-a.p1) * t;
                }
 */                
                                string itos( int i ) {
                                ostringstream s ;
                                s << i ;
                                return s.str() ;
                                }
                                 
                                int gcd(int v,int b){
                                	if(v>b) return gcd(b,v);
                                	if(v==b) return b;
                                	if(b%v==0) return v;
                                	return gcd(v,b%v);
                                }
                 
                                double distans(double x1,double y1,double x2,double y2){
                                	double rr=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
                                	return sqrt(rr);
                                	
                                }
                                int mod;
                                
                int pr[500010];
                int inv[500010];
                
                int beki(int wa,int rr,int warukazu){
                	if(rr==0) return 1%warukazu;
                	if(rr==1) return wa%warukazu;
                	if(rr%2==1) return (beki(wa,rr-1,warukazu)*wa)%warukazu;
                	int zx=beki(wa,rr/2,warukazu);
                	return (zx*zx)%warukazu;
                }
    double bekid(double w,int r){
    	if(r==0) return 1.0;
    	if(r==1) return w;
    	if(r%2) return bekid(w,r-1)*w;
    	double f=bekid(w,r/2);
    	return f*f;
    }
                
    			int comb(int nn,int rr){
    				int r=pr[nn]*inv[rr];
    				r%=mod;
    				r*=inv[nn-rr];
    				r%=mod;
    				return r;
    			}
                
                void gya(int ert){
                	pr[0]=1;
                	for(int i=1;i<ert;i++){
                		pr[i]=(pr[i-1]*i)%mod;
                	}
                	for(int i=0;i<ert;i++) inv[i]=beki(pr[i],mod-2,mod);
                	
                }
                
              //   cin.tie(0);
    		//	ios::sync_with_stdio(false);
    			//priority_queue<pa3,vector<pa3>,greater<pa3>> pq;            
                 //sort(ve.begin(),ve.end(),greater<int>());
                                         //----------------kokomade tenpure------------
                //vector<double> ans(100000000),ans2(100000000)
      


vector<int> ve(13001,0);

vector<int> tasu(vector<int> v1,vector<int> v2){
	int ku=0;
	for(int i=13000;i>0;i--){
		v1[i]+=v2[i]+ku;
		if(v1[i]>10)v1[i]-=10,ku=1;
		else ku=0;
	}
	v1[0]+=v2[0]+ku;
	return v1;
}

vector<int>waru(vector<int> v1,int d){
	int ku=0;
	vector<int> v2(13001,0);
	
	for(int i=0;i<=13000;i++){
		v2[i]=(ku*10+v1[i])/d;
		ku=(ku*10+v1[i])%d;
	}
	return v2;
}

vector<int> gyaku(int r){
	vector<int> v2(13001,0);
	v2[0]=1;
	return waru(v2,r);
}
  signed main(){
    	       cin.tie(0);
    			ios::sync_with_stdio(false);
while(1){
int n,k,m,r;
  	cin>>n>>k>>m>>r;
if(n==0)exit(0);
for(int i=0;i<13001;i++)ve[i]=0;
  	if(m==0){
  		
  		{
  			ve[0]=1;
  			ve=waru(ve,n);
  			cout<<ve[0]<<".";
  			for(int i=0;i<r;i++)cout<<ve[i+1];
  			cout<<endl;
  			continue;
  		}
  	}
  	
  	if(n<=2){
  		cout<<"1.";
  		for(int i=0;i<r;i++)cout<<"0";
  		cout<<endl;
  		continue;
  	}
  	
  	ve[0]=2;
  	for(int i=2;i<=n-1;i++){
  		vector<int> gya=gyaku(i);
  		ve=tasu(ve,gya);
  	}
  	ve=waru(ve,n);
  	
cout<<ve[0]<<".";
  			for(int i=0;i<r;i++)cout<<ve[i+1];
  			cout<<endl;
}
  	return 0;
    }
accuracy: 1
time_ms: 3340
memory_kb: 3364
final_rank: 20

code_snippet: // 解説を見た　こんなの思い付けない
#include<iostream>
#include<cstring>
using namespace std;

int a[10010], b[10010];

void calc(int x, int y){
    memset(b, 0, sizeof(b));
    x *= 10;
    for(int i = 1; i <= 10009; i++){
        b[i] = x/y;
        x %= y;
        x *= 10;
    }
    int carry = 0;
    for(int i = 10009; i >= 0; i--){
        a[i] += b[i]+carry;
        carry = 0;
        if(a[i] >= 10)   a[i] -= 10, carry++;
    }
}

int main(){
    int n, k, m, r;
    while(cin>>n>>k>>m>>r, n){
        memset(a, 0, sizeof(a));
        calc(1, n);
        if(m == 1){
            for(int i = 1; i <= n-1; i++){
                calc(1, n*i);
            }
        }
        cout << a[0] << ".";
        for(int i = 0; i < r; i++)  cout << a[1+i];
        cout << endl;
    }
    return 0;
}
accuracy: 1
time_ms: 1240
memory_kb: 3080
final_rank: 9

code_snippet: #include <bits/stdc++.h>

#define fst(t) std::get<0>(t)
#define snd(t) std::get<1>(t)
#define thd(t) std::get<2>(t)
#define unless(p) if(!(p))
#define until(p) while(!(p))

using ll = std::int64_t;
using P = std::tuple<int,int>;

template <int r>
struct Decimal{
    std::vector<int> digits;
    
    Decimal(int n) : digits(r + 1, 0) { // 1/n
        int rem = 1;
        for(int i=1;i<=r;++i){
            rem *= 10;
            digits[i] = rem / n;
            rem %= n;
        }
    }

    Decimal<r>& operator+=(Decimal<r> &rhs){
        for(int i=r;i>0;--i){
            digits[i] += rhs.digits[i];
            if(digits[i] >= 10){
                digits[i] -= 10;
                digits[i - 1] += 1;
            }
        }

        return *this;
    }
};

constexpr int r = 10100;

int main(){
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);

    while(true){
        int N, K, M, R;
        std::cin >> N >> K >> M >> R;

        if(N == 0){
            break;
        }

        Decimal<r> p(N);

        if(M == 1){
            for(int k=1;k<=N-1;++k){
                Decimal<r> d(k * N);
                p += d;
            }
        }

        std::cout << p.digits[0] << ".";
        for(int i=1;i<=R;++i){
            std::cout << p.digits[i];
        }
        std::cout << std::endl;
    }
}
accuracy: 1
time_ms: 1310
memory_kb: 3184
final_rank: 14

code_snippet: #include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define NUM 11000

int N,K,M,R;
int ans[NUM];

void calc(int bunshi,int bunbo){

	for(int i = 0; i < NUM; i++){
		ans[i] += bunshi/bunbo;
		bunshi %= bunbo;
		bunshi *= 10;
		if(bunshi == 0)return;
	}
}

void func(){

	for(int i = 0; i < NUM; i++)ans[i] = 0;

	if(M == 0){
		calc(1,N);
	}else{ //M == 1
		calc(1,N);
		for(int a = 1; a <= N-1; a++){
			calc(1,N*a);
		}
	}

	for(int a = NUM-1; a >= 1; a--){
		if(ans[a] >= 10){
			ans[a-1] += ans[a]/10;
			ans[a] %= 10;
		}
	}

	printf("%d.",ans[0]);
	for(int a = 1; a <= R; a++){
		printf("%d",ans[a]);
	}
	printf("\n");
}


int main(){

	while(true){
		scanf("%d %d %d %d",&N,&K,&M,&R);
		if(N == 0 && K == 0 && M == 0 && R == 0)break;

		func();
	}

	return 0;
}
accuracy: 1
time_ms: 920
memory_kb: 3156
final_rank: 11

code_snippet: #include <iostream>
using namespace std;

const int MAX = 10020;
int d[MAX + 5];
int a[MAX + 5];

void div(int n, int *d) {
	int val = 1;
	for (int i = 0; i < MAX; i++) {
		d[i] = val / n;
		val %= n;
		val *= 10;
	}
}

void add(int *src, int *dst) {
	for (int i = MAX - 1; i >= 0; i--) {
		dst[i] += src[i];
	}
	for (int i = MAX - 1; i > 0; i--) {
		dst[i - 1] += dst[i] / 10;
		dst[i] %= 10;
	}
}

void fix(int *tmp, int *a) {
	for (int i = 0; i < MAX; i++) tmp[i] = 0;
	tmp[MAX - 5] = 1;
	add(tmp, a);
}

int main() {
	int n, k, m, r;
	while (cin >> n >> k >> m >> r) {
		if (!n) break;
		for (int i = 0; i < MAX; i++) a[i] = 0;
		
		//add 1/n
		div(n, d);
		add(d, a);
		
		if (m == 1) {
			for (int i = n - 1; i > 0; i--) {
				div(n * i, d);
				add(d, a);
			}
		}
		
		//fix(d, a);
		
		cout << a[0] << ".";
		for (int i = 1; i <= r; i++) cout << a[i];
		cout << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 1250
memory_kb: 3160
final_rank: 13

code_snippet: #include <iostream>
using namespace std;

const int MAX = 10020;
int d[MAX + 5];
int a[MAX + 5];

void div(int n, int *d) {
	int val = 1;
	for (int i = 0; i < MAX; i++) {
		d[i] = val / n;
		val %= n;
		val *= 10;
	}
}

void add(int *src, int *dst) {
	for (int i = MAX - 1; i >= 0; i--) {
		dst[i] += src[i];
	}
	for (int i = MAX - 1; i > 0; i--) {
		dst[i - 1] += dst[i] / 10;
		dst[i] %= 10;
	}
}

void fix(int *tmp, int *a) {
	for (int i = 0; i < MAX; i++) tmp[i] = 0;
	tmp[MAX - 5] = 1;
	add(tmp, a);
}

int main() {
	int n, k, m, r;
	while (cin >> n >> k >> m >> r) {
		if (!n) break;
		for (int i = 0; i < MAX; i++) a[i] = 0;
		
		//add 1/n
		div(n, d);
		add(d, a);
		
		if (m == 1) {
			for (int i = n - 1; i > 0; i--) {
				div(n * i, d);
				add(d, a);
			}
		}
		
		fix(d, a);
		
		cout << a[0] << ".";
		for (int i = 1; i <= r; i++) cout << a[i];
		cout << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 1260
memory_kb: 3064
final_rank: 7

code_snippet: #include "bits/stdc++.h"
#define ll long long
using namespace std;
void calc(int n,int r, vector<int>& ans) {
	int digit = 1;
	for (int i = 0; i <= r; i++) {
		int temp = digit / n;
		temp %= 10;
		ans[i] += temp;
		digit %= n;
		digit *= 10;
	}
}

int main() {
	int n, k, m, r;
	while (true) {
		cin >> n >> k >> m >> r;
		if (n == 0 && k == 0 && m == 0 && r == 0) break;
		vector<int> ans(10055, 0);
		calc(n,10050,ans);
		if (m == 1) {
			for (int i = 1; i < n;i++) {
				calc(i*n, 10050, ans);
			}
		}

		for (int i = 10050; i > 0;i--) {
			ans[i - 1] += (ans[i] / 10);
			ans[i] %= 10;
		}

		cout << ans[0] << ".";
		for (int i = 1; i <= r;i++) cout << ans[i];
		cout << endl;
	}
}
accuracy: 1
time_ms: 890
memory_kb: 3108
final_rank: 5

code_snippet: #include<iostream>
#include<vector>
#include<string>
#include<algorithm>	
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdio>
#include<sstream>
#include<iomanip>
#include<assert.h>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mt make_tuple
#define all(in) in.begin(),in.end()
#define shosu(x) fixed<<setprecision(x)
using namespace std;
//kaewasuretyuui
typedef long long ll;
typedef int Def;
typedef pair<Def,Def> pii;
typedef vector<Def> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef vector<string> vs;
typedef vector<double> vd;
//typedef tuple<int,int,int> tp;
//typedef vector<tp> vt;
typedef vector<vd> vvd;
typedef pair<Def,pii> pip;
typedef vector<pip>vip;
const double PI=acos(-1);
const double EPS=1e-7;
const int inf=1e9;
const ll INF=2e18;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int n,k,m,r;
int out[10010];
void add(int a){
	int t=1;
	int co=0;
	while(t&&co<10010){
		out[co]+=t/a;
		t=t-t/a*a;
		t*=10;
		co++;
	}
	for(int i=10009;i>=1;i--){
		out[i-1]+=out[i]/10;
		out[i]%=10;
	}
}
void div(int a=n){
	int t=0;
	rep(i,10010){
		t*=10;
		t+=out[i];
		out[i]=t/a;
		t=t-t/a*a;
	}
}
int main(){
	while(cin>>n>>k>>m>>r,n){
		rep(i,10010)out[i]=0;
		if(m){
			loop(i,1,n)add(i);
			div();
		}
		add(n);
		cout<<out[0]<<".";
		rep(i,r)cout<<out[i+1];
		cout<<endl;
	}
}
accuracy: 1
time_ms: 1200
memory_kb: 3080
final_rank: 8

code_snippet: #include<iostream>
using namespace std;
int a[100000], n, k, m, r;
inline void Div(int l, int s) {
	int p = l * 10, q = s;
	for (int i = 0; i < r + 10; i++) {
		a[i] += p / q; p = (p%q) * 10;
	}
}
int main() {
	while (true) {
		for (int i = 0; i < 10200; i++)a[i] = 0;
		cin >> n >> k >> m >> r; if (n == 0)break;
		Div(1, n);
		if (m == 1) { for (int i = 1; i < n; i++) { Div(1, n*i); } }
		for (int i = r + 10; i >= 1; i--) {
			if (a[i] >= 10) { a[i - 1] += a[i] / 10; a[i] %= 10; }
		}
		cout << a[0] / 10 << '.'; for (int i = 0; i < r; i++)cout << a[i] % 10; cout << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 830
memory_kb: 3096
final_rank: 3

code_snippet: #include<iostream>
using namespace std;
int a[100000], n, k, m, r;
inline void Div(int l, int s) {
	int p = l * 10, q = s;
	for (int i = 0; i < r + 10; i++) {
		a[i] += p / q; p = p%q; p *= 10;
	}
}
int main() {
	while (true) {
		for (int i = 0; i < 10200; i++)a[i] = 0;
		cin >> n >> k >> m >> r; if (n == 0)break;
		Div(1, n);
		if (m == 1) { for (int i = 1; i < n; i++) { Div(1, n*i); } }
		for (int i = r + 10; i >= 1; i--) {
			if (a[i] >= 10) { a[i - 1] += a[i] / 10; a[i] %= 10; }
		}
		cout << a[0] / 10 << '.'; for (int i = 0; i < r; i++)cout << a[i] % 10; cout << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 830
memory_kb: 3040
final_rank: 1