#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
int dcmp(double x) {
  if (fabs(x) < eps) return 0;
  if (x > 0) return 1;
  return -1;
}
struct node {
  int v, next;
  double w;
} edge[1110];
int head[60], cnt;
void addedge(int u, int v, double w) {
  edge[cnt].v = v;
  edge[cnt].w = w;
  edge[cnt].next = head[u];
  head[u] = cnt++;
}
int num[60];
double cao[60];
int main() {
  int n, w, m;
  scanf("%d%d%d", &n, &w, &m);
  memset(head, -1, sizeof(head));
  cnt = 0;
  int flag = 0;
  double ave = 1.0 * n * w / m;
  for (int i = 1; i <= m; i++) cao[i] = ave;
  int now = 1;
  double fuck = w;
  for (int i = 1; i <= m; i++) {
    if (dcmp(fuck - cao[i]) >= 0) {
      fuck -= cao[i];
      addedge(i, now, cao[i]);
      num[now]++;
      cao[i] = 0;
      if (dcmp(fuck) == 0) {
        now++;
        fuck = w;
      }
    } else {
      addedge(i, now, fuck);
      cao[i] -= fuck;
      num[now]++;
      now++;
      fuck = w;
      i--;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (num[i] > 2) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  for (int i = 1; i <= m; i++) {
    for (int j = head[i]; j != -1; j = edge[j].next)
      printf("%d %.6f ", edge[j].v, edge[j].w);
    printf("\n");
  }
  return 0;
}
