// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>		// Вывод в консоль
#include <tchar.h>
//#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота
};

unsigned int matrix[1000000];
Job jobList[10000];
unsigned int buffer[1000];
unsigned int * bp = &buffer[0];

int _tmain(int argc, _TCHAR* argv[])
{
	// Ввод данных от пользователя
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	scanf_s("%d%d%d", &matrixHeight, &matrixWidth, &jobCount);

	// Делаем матрицу
	int sz = matrixWidth * matrixHeight;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			scanf_s("%d", &matrix[h * 1000 + w]);
		}
	}

	// Делаем массив задач
	for (int i = 0; i < jobCount; i++) {
		scanf_s("%d%d%d%d%d%d", &jobList[i].y1, &jobList[i].x1, &jobList[i].y2, &jobList[i].x2, &jobList[i].h, &jobList[i].w);
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	//int widthDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;
	unsigned int * mp1, * mp2;

	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		memcpy(&j, &jobList[jc], sizeof(Job));
		j.x1--;
		j.x2--;
		j.y1--;
		j.y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = j.y1 + j.h;
		heightDiff = (j.y2 - j.y1) * 1000;

		// Вычисляем размер строки в байтах
		width = j.w * sizeof(unsigned int);
		//widthDiff = j.x2 - j.x1;

		// Проходимся по строкам
		for (int r = j.y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * 1000;
			row2 = row1 + heightDiff;
			col1 = row1 + j.x1;
			col2 = row2 + j.x2;

			mp1 = &matrix[col1];
			mp2 = &matrix[col2];

			memcpy(bp, mp1, width);
			memcpy(mp1, mp2, width);
			memcpy(mp2, bp, width);
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			printf("%d ", matrix[h * 1000 + w]);
		}
		printf("\n");
	}

	//system("pause");
	return 0;
}


// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
#include "stdafx.h"
#include <iostream>		// Вывод в консоль
#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота
};

int _tmain(int argc, _TCHAR* argv[])
{
	/*
	// А давайте включим русский, дети!
	setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	// И воткнём другой шрифт, чтобы нормально отображались
	// русские символы
	CONSOLE_FONT_INFOEX info = { 0 };
	info.cbSize = sizeof(info);
	info.dwFontSize.Y = 14;
	info.FontWeight = FW_NORMAL;
	wcscpy_s(info.FaceName, L"Lucida Console");
	SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), NULL, &info);
	*/
	// Очистка входящего буффера
	cin.clear();
	fflush(stdin);

	// Ввод данных от пользователя
	//cout << "Введите высоту и ширину матрицы, а так же количество задач: ";
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	cin
		>> matrixHeight
		>> matrixWidth
		>> jobCount;

	// Делаем матрицу
	//cout << "Введите каждый элемент матрицы (" << matrixWidth << "x" << matrixHeight << "): " << endl;
	int sz = matrixWidth * matrixHeight;
	int* matrix = new int[sz];
	for (int i = 0; i < sz; i++) {
		cin >> matrix[i];
	}

	// Делаем массив задач
	Job* jobList = new Job[jobCount];
	for (int i = 0; i < jobCount; i++) {
		//cout << "Введите y1, x1, y2, x2, h, w для задачи номер "<< (i+1) <<": ";
		cin
			>> jobList[i].y1
			>> jobList[i].x1
			>> jobList[i].y2
			>> jobList[i].x2
			>> jobList[i].h
			>> jobList[i].w;
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;

	// Буффер создаём в начале работы, будет реюз
	void* buffer = malloc(matrixWidth * sizeof(int));
	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		memcpy(&j, &jobList[jc], sizeof(Job));
		j.x1--;
		j.x2--;
		j.y1--;
		j.y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = j.y1 + j.h;
		heightDiff = (j.y2 - j.y1) * matrixWidth;

		// Вычисляем размер строки в байтах
		width = j.w * sizeof(int);

		// Проходимся по строкам
		for (int r = j.y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * matrixWidth;
			row2 = row1 + heightDiff;
			col1 = row1 + j.x1;
			col2 = row2 + j.x2;

			// А давайте гонять память як школьник писюн!
			memcpy(buffer,			matrix + col1,	width);
			memcpy(matrix + col1,	matrix + col2,	width);
			memcpy(matrix + col2,	buffer,			width);
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	int col = 0;
	for (int i = 0; i < sz; i++) {
		cout << matrix[i] << " ";
		col++;
		if (col == matrixWidth) {
			col = 0;
			cout << endl;
		}
	}

	// Ждём Enter
	//system("pause");

	// Освобождаем нашу память
	free(buffer);
	delete[] jobList;
	delete[] matrix;
	return 0;
}


// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
#include <stdio.h>
#include <iostream>		// Вывод в консоль
#include <tchar.h>
//#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	unsigned char x1, y1;		// Верхний угол первого прямоугольника
	unsigned char x2, y2;		// Верхний угол второго прямоугольника
	unsigned char w, h;		// Ширина и высота
};

int _tmain(int argc, _TCHAR* argv[])
{
	/*
	// А давайте включим русский, дети!
	setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	// И воткнём другой шрифт, чтобы нормально отображались
	// русские символы
	CONSOLE_FONT_INFOEX info = { 0 };
	info.cbSize = sizeof(info);
	info.dwFontSize.Y = 14;
	info.FontWeight = FW_NORMAL;
	wcscpy_s(info.FaceName, L"Lucida Console");
	SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), NULL, &info);
	*/
	// Очистка входящего буффера
	cin.clear();
	fflush(stdin);

	// Ввод данных от пользователя
	//cout << "Введите высоту и ширину матрицы, а так же количество задач: ";
	unsigned char matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	cin
		>> matrixHeight
		>> matrixWidth
		>> jobCount;

	// Делаем матрицу
	//cout << "Введите каждый элемент матрицы (" << matrixWidth << "x" << matrixHeight << "): " << endl;
	unsigned char sz = matrixWidth * matrixHeight;
	unsigned char* matrix = new unsigned char[sz];
	for (int i = 0; i < sz; i++) {
		cin >> matrix[i];
	}

	// Делаем массив задач
	Job* jobList = new Job[jobCount];
	for (int i = 0; i < jobCount; i++) {
		//cout << "Введите y1, x1, y2, x2, h, w для задачи номер "<< (i+1) <<": ";
		cin
			>> jobList[i].y1
			>> jobList[i].x1
			>> jobList[i].y2
			>> jobList[i].x2
			>> jobList[i].h
			>> jobList[i].w;
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;

	// Буффер создаём в начале работы, будет реюз
	void* buffer = malloc(matrixWidth * sizeof(unsigned char));
	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		memcpy(&j, &jobList[jc], sizeof(Job));
		j.x1--;
		j.x2--;
		j.y1--;
		j.y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = j.y1 + j.h;
		heightDiff = (j.y2 - j.y1) * matrixWidth;

		// Вычисляем размер строки в байтах
		width = j.w * sizeof(unsigned char);

		// Проходимся по строкам
		for (int r = j.y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * matrixWidth;
			row2 = row1 + heightDiff;
			col1 = row1 + j.x1;
			col2 = row2 + j.x2;

			// А давайте гонять память як школьник писюн!
			memcpy(buffer,			matrix + col1,	width);
			memcpy(matrix + col1,	matrix + col2,	width);
			memcpy(matrix + col2,	buffer,			width);
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	int col = 0;
	for (int i = 0; i < sz; i++) {
		cout << matrix[i] << " ";
		col++;
		if (col == matrixWidth) {
			col = 0;
			cout << endl;
		}
	}

	// Ждём Enter
	//system("pause");

	// Освобождаем нашу память
	free(buffer);
	delete[] jobList;
	delete[] matrix;
	return 0;
}


// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>		// Вывод в консоль
#include <tchar.h>
//#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота
};

unsigned int matrix[1000000];
unsigned int * mp = &matrix[0];
Job jobList[10000];
unsigned int buffer[1000];
unsigned int * bp = &buffer[0];

int _tmain(int argc, _TCHAR* argv[])
{
	// Ввод данных от пользователя
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	scanf_s("%d%d%d", &matrixHeight, &matrixWidth, &jobCount);

	// Делаем матрицу
	int sz = matrixWidth * matrixHeight;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			scanf_s("%d", mp + h * 1000 + w);
		}
	}

	// Делаем массив задач

	Job jp;
	for (int i = 0; i < jobCount; i++) {
		scanf_s("%d%d%d%d%d%d", &jp.y1, &jp.x1, &jp.y2, &jp.x2, &jp.h, &jp.w);
		memcpy(&jobList[i], &jp, sizeof(Job));
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	//Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	//int widthDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;
	unsigned int * mp1, * mp2;
	unsigned int swp;

	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		//memcpy(&j, &jobList[jc], sizeof(Job));
		jobList[jc].x1--;
		jobList[jc].x2--;
		jobList[jc].y1--;
		jobList[jc].y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = jobList[jc].y1 + jobList[jc].h;
		heightDiff = (jobList[jc].y2 - jobList[jc].y1) * 1000;

		// Вычисляем размер строки в байтах
		//width = j.w * sizeof(unsigned int);
		//widthDiff = j.x2 - j.x1;

		// Проходимся по строкам
		for (int r = jobList[jc].y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * 1000;
			row2 = row1 + heightDiff;
			col1 = row1 + jobList[jc].x1;
			col2 = row2 + jobList[jc].x2;

			//mp1 = &matrix[col1];
			//mp2 = &matrix[col2];

			//memcpy(bp, mp1, width);
			//memcpy(mp1, mp2, width);
			//memcpy(mp2, bp, width);
			for (int c = 0; c < jobList[jc].w; c++) {
				swp = matrix[col1+c];
				matrix[col1+c] = matrix[col2+c];
				matrix[col2+c] = swp;
			}
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			printf("%d ", matrix[h * 1000 + w]);
		}
		printf("\n");
	}

	//system("pause");
	return 0;
}


//#define IN_VS
//#include "stdafx.h"

// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире

#include <stdio.h>
#include <iostream>
#include <tchar.h>

using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота

	Job *next;		// Следующая задача
};

// Одна клетка матрицы
struct Cell {
	Cell *left, *right, *up, *down;		// Соседние клетки
	unsigned int value;					// Значение в этой клетке
};

// Первая клетка
Cell * firstCell;

// Первая задача
Job * firstJob;

// Получение клетки по координатам
Cell * GetCellFromCoord(int cx, int cy) {
	Cell * c = firstCell;
	int cdx = cx, cdy = cy;
	while (cdx) {
		c = c->right;
		cdx--;
	}
	while (cdy) {
		c = c->down;
		cdy--;
	}
	return c;
}

int _tmain(int argc, _TCHAR* argv[])
{
	// Ввод габаритов матрицы и
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	scanf_s("%d%d%d", &matrixHeight, &matrixWidth, &jobCount);

	// Делаем первый пустой столбец
	Cell * prevCell = 0;
	Cell * currentCell;
	int mw2 = matrixWidth + 2;
	for (int i = 0; i < mw2; i++) {
		currentCell = new Cell();
		currentCell->left = prevCell;
		if (prevCell) {
			prevCell->right = currentCell;
		}
		else {
			firstCell = currentCell;
		}
		prevCell = currentCell;
	}

	// Заполняем строки
	Cell * firstTopCell = firstCell;
	Cell * currentTopCell = 0;
	int mh1 = matrixHeight + 1;
	for (int h = 0; h < mh1; h++) {
		prevCell = 0;
		for (int w = 0; w < mw2; w++) {
			currentCell = new Cell();
			currentCell->left = prevCell;
			if (prevCell) {
				prevCell->right = currentCell;
				if (h < matrixHeight && w <= matrixWidth) {
					scanf_s("%d", &currentCell->value);
				}
			}
			else {
				currentTopCell = firstTopCell;
				firstTopCell = currentCell;
			}
			currentCell->up = currentTopCell;
			currentTopCell->down = currentCell;
			currentTopCell = currentTopCell->right;
			prevCell = currentCell;
		}

	}

	// Делаем массив задач
	Job *j, *jprev = 0;
	for (int i = 0; i < jobCount; i++) {
		j = new Job();
		scanf_s("%d%d%d%d%d%d", &j->y1, &j->x1, &j->y2, &j->x2, &j->h, &j->w);
		if (jprev) {
			jprev->next = j;
		}
		else {
			firstJob = j;
		}
		jprev = j;
	}

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int diff = 0;
	int skip = 0;

	// Ссылки
	Cell *startOneCell, *startTwoCell;
	Cell *nearOneCell, *farOneCell;
	Cell *nearTwoCell, *farTwoCell;
	Cell *swp;

	// Работаем с задачами
	j = firstJob;
	while (j) {

		// Ищем верхние углы
		startOneCell = GetCellFromCoord(j->x1, j->y1);
		startTwoCell = GetCellFromCoord(j->x2, j->y2);

		// Ищем левых-правых родителей
		nearOneCell = startOneCell;
		farOneCell = nearOneCell;
		nearTwoCell = startTwoCell;
		farTwoCell = nearTwoCell;
		skip = j->w-1;
		while (skip) {
			farOneCell = farOneCell->right;
			farTwoCell = farTwoCell->right;
			skip--;
		}

		// Меняем левых-правых родителей
		skip = j->h;
		while (skip) {

			// Ссылка у левого родителя
			nearOneCell->left->right = nearTwoCell;
			nearTwoCell->left->right = nearOneCell;
			// Ссылка у правого родителя
			farOneCell->right->left = farTwoCell;
			farTwoCell->right->left = farOneCell;

			// Левый родитель
			swp = nearOneCell->left;
			nearOneCell->left = nearTwoCell->left;
			nearTwoCell->left = swp;
			// Правый родитель
			swp = farOneCell->right;
			farOneCell->right = farTwoCell->right;
			farTwoCell->right = swp;

			nearOneCell = nearOneCell->down;
			nearTwoCell = nearTwoCell->down;
			farOneCell = farOneCell->down;
			farTwoCell = farTwoCell->down;
			skip--;
		}

		// Ищем верхних-нижних родителей
		nearOneCell = startOneCell;
		farOneCell = nearOneCell;
		nearTwoCell = startTwoCell;
		farTwoCell = nearTwoCell;
		skip = j->h-1;
		while (skip) {
			farOneCell = farOneCell->down;
			farTwoCell = farTwoCell->down;
			skip--;
		}

		// Меняем верхних-нижних родителей
		skip = j->w;
		while (skip) {

			// Ссылка у левого родителя
			nearOneCell->up->down = nearTwoCell;
			nearTwoCell->up->down = nearOneCell;
			// Ссылка у правого родителя
			farOneCell->down->up = farTwoCell;
			farTwoCell->down->up = farOneCell;

			// Левый родитель
			swp = nearOneCell->up;
			nearOneCell->up = nearTwoCell->up;
			nearTwoCell->up = swp;
			// Правый родитель
			swp = farOneCell->down;
			farOneCell->down = farTwoCell->down;
			farTwoCell->down = swp;

			nearOneCell = nearOneCell->right;
			nearTwoCell = nearTwoCell->right;
			farOneCell = farOneCell->right;
			farTwoCell = farTwoCell->right;
			skip--;
		}

		j = j->next;
	}

	// Вывод данных
	Cell * start = firstCell->down;
	int heightAccum = matrixHeight;
	int widthAccum;

	while (heightAccum) {
		widthAccum = matrixWidth;
		currentCell = start->right;
		while (widthAccum) {
			printf("%d ", currentCell->value);
			currentCell = currentCell->right;
			widthAccum--;
		}
		start = start->down;
		printf("\n");
		heightAccum--;
	}
	//system("pause");

	return 0;
}


// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>		// Вывод в консоль
#include <tchar.h>
//#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота
};

unsigned int matrix[1000000];
Job jobList[10000];
unsigned int buffer[1000];
unsigned int * bp = &buffer[0];

int _tmain(int argc, _TCHAR* argv[])
{
	// Ввод данных от пользователя
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	scanf_s("%d%d%d", &matrixHeight, &matrixWidth, &jobCount);

	// Делаем матрицу
	int sz = matrixWidth * matrixHeight;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			scanf_s("%d", &matrix[h * 1000 + w]);
		}
	}

	// Делаем массив задач
	for (int i = 0; i < jobCount; i++) {
		scanf_s("%d%d%d%d%d%d", &jobList[i].y1, &jobList[i].x1, &jobList[i].y2, &jobList[i].x2, &jobList[i].h, &jobList[i].w);
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	//int widthDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;
	unsigned int * mp1, * mp2;
	unsigned int swp;

	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		memcpy(&j, &jobList[jc], sizeof(Job));
		j.x1--;
		j.x2--;
		j.y1--;
		j.y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = j.y1 + j.h;
		heightDiff = (j.y2 - j.y1) * 1000;

		// Вычисляем размер строки в байтах
		//width = j.w * sizeof(unsigned int);
		//widthDiff = j.x2 - j.x1;

		// Проходимся по строкам
		for (int r = j.y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * 1000;
			row2 = row1 + heightDiff;
			col1 = row1 + j.x1;
			col2 = row2 + j.x2;

			//mp1 = &matrix[col1];
			//mp2 = &matrix[col2];

			//memcpy(bp, mp1, width);
			//memcpy(mp1, mp2, width);
			//memcpy(mp2, bp, width);
			for (int c = 0; c < j.w; c++) {
				swp = matrix[col1+c];
				matrix[col1+c] = matrix[col2+c];
				matrix[col2+c] = swp;
			}
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			printf("%d ", matrix[h * 1000 + w]);
		}
		printf("\n");
	}

	//system("pause");
	return 0;
}


// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
#include <stdio.h>
#include <iostream>		// Вывод в консоль
#include <tchar.h>
//#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота
};

int _tmain(int argc, _TCHAR* argv[])
{
	cin.clear();
	fflush(stdin);

	// Ввод данных от пользователя
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	cin
		>> matrixHeight
		>> matrixWidth
		>> jobCount;

	// Делаем матрицу
	unsigned int matrix[1000000];
	int sz = matrixWidth * matrixHeight;
	for (int i = 0; i < sz; i++) {
		cin >> matrix[i];
	}

	// Делаем массив задач
	Job jobList[10000];
	for (int i = 0; i < jobCount; i++) {
		cin
			>> jobList[i].y1
			>> jobList[i].x1
			>> jobList[i].y2
			>> jobList[i].x2
			>> jobList[i].h
			>> jobList[i].w;
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;

	// Буффер создаём в начале работы, будет реюз
	unsigned int buffer[1000];
	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		memcpy(&j, &jobList[jc], sizeof(Job));
		j.x1--;
		j.x2--;
		j.y1--;
		j.y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = j.y1 + j.h;
		heightDiff = (j.y2 - j.y1) * 1000;

		// Вычисляем размер строки в байтах
		width = j.w * sizeof(unsigned int);

		// Проходимся по строкам
		for (int r = j.y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * 1000;
			row2 = row1 + heightDiff;
			col1 = row1 + j.x1;
			col2 = row2 + j.x2;

			// А давайте гонять память як школьник писюн!
			memcpy(buffer,			matrix + col1,	width);
			memcpy(matrix + col1,	matrix + col2,	width);
			memcpy(matrix + col2,	buffer,			width);
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	int col = 0;
	for (int i = 0; i < sz; i++) {
		cout << matrix[i] << " ";
		col++;
		if (col == matrixWidth) {
			col = 0;
			cout << endl;
		}
	}
	return 0;
}


// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>		// Вывод в консоль
#include <tchar.h>
//#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота
};

unsigned int matrix[1000000];
Job jobList[10000];
unsigned int buffer[1000];
unsigned int * bp = &buffer[0];

int _tmain(int argc, _TCHAR* argv[])
{
	cin.clear();
	fflush(stdin);

	// Ввод данных от пользователя
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	cin
		>> matrixHeight
		>> matrixWidth
		>> jobCount;

	// Делаем матрицу
	int sz = matrixWidth * matrixHeight;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			cin >> matrix[h * 1000 + w];
		}
	}

	// Делаем массив задач
	for (int i = 0; i < jobCount; i++) {
		cin
			>> jobList[i].y1
			>> jobList[i].x1
			>> jobList[i].y2
			>> jobList[i].x2
			>> jobList[i].h
			>> jobList[i].w;
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	//int widthDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;
	unsigned int * mp1, * mp2;

	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		memcpy(&j, &jobList[jc], sizeof(Job));
		j.x1--;
		j.x2--;
		j.y1--;
		j.y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = j.y1 + j.h;
		heightDiff = (j.y2 - j.y1) * 1000;

		// Вычисляем размер строки в байтах
		width = j.w * sizeof(unsigned int);
		//widthDiff = j.x2 - j.x1;

		// Проходимся по строкам
		for (int r = j.y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * 1000;
			row2 = row1 + heightDiff;
			col1 = row1 + j.x1;
			col2 = row2 + j.x2;

			mp1 = &matrix[col1];
			mp2 = &matrix[col2];

			memcpy(bp, mp1, width);
			memcpy(mp1, mp2, width);
			memcpy(mp2, bp, width);
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			cout << matrix[h * 1000 + w]<< " ";
		}
		cout << endl;
	}

	//system("pause");
	return 0;
}


// Программа выполнения работы Василия - человека, который
// работает на самой идиотской работе в мире
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>		// Вывод в консоль
#include <tchar.h>
//#include <Windows.h>	// Библиотека Windows
using namespace std;

// Структура под задания Васи
struct Job {
	int x1, y1;		// Верхний угол первого прямоугольника
	int x2, y2;		// Верхний угол второго прямоугольника
	int w, h;		// Ширина и высота
};

unsigned int matrix[1000000];
unsigned int * mp = &matrix[0];
Job jobList[10000];
unsigned int buffer[1000];
unsigned int * bp = &buffer[0];

int _tmain(int argc, _TCHAR* argv[])
{
	// Ввод данных от пользователя
	int matrixWidth = 0, matrixHeight = 0, jobCount = 0;
	scanf_s("%d%d%d", &matrixHeight, &matrixWidth, &jobCount);

	// Делаем матрицу
	int sz = matrixWidth * matrixHeight;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			scanf_s("%d", mp + h * 1000 + w);
		}
	}

	// Делаем массив задач

	Job jp;
	for (int i = 0; i < jobCount; i++) {
		scanf_s("%d%d%d%d%d%d", &jp.y1, &jp.x1, &jp.y2, &jp.x2, &jp.h, &jp.w);
		memcpy(&jobList[i], &jp, sizeof(Job));
	}

	// А теперь - работаем

	// Заводим структуру, потому что так быстрее
	Job j;

	// Временные переменные
	// Задаём снаружи чтобы избежать аллокации памяти внутри цикла
	int height = 0;
	int width = 0;
	int heightDiff = 0;
	//int widthDiff = 0;
	int row1 = 0;
	int row2 = 0;
	int col1 = 0;
	int col2 = 0;
	unsigned int * mp1, * mp2;
	unsigned int swp;

	for (int jc = 0; jc < jobCount; jc++) {

		// Скопировать в новую структуру гораздо проще, чем индексировать
		// массив большое количество раз
		// Так как оффсеты начинаются с единицы, уменьшаем их
		memcpy(&j, &jobList[jc], sizeof(Job));
		j.x1--;
		j.x2--;
		j.y1--;
		j.y2--;

		// Вычисляем разницу в высоте двух прямоугольников в байтах
		height = j.y1 + j.h;
		heightDiff = (j.y2 - j.y1) * 1000;

		// Вычисляем размер строки в байтах
		width = j.w * sizeof(unsigned int);
		//widthDiff = j.x2 - j.x1;

		// Проходимся по строкам
		for (int r = j.y1; r < height; r++) {

			// Оффсеты строк и столбцов
			row1 = r * 1000;
			row2 = row1 + heightDiff;
			col1 = row1 + j.x1;
			col2 = row2 + j.x2;

			mp1 = mp + col1;
			mp2 = mp + col2;

			memcpy(bp, mp1, width);
			memcpy(mp1, mp2, width);
			memcpy(mp2, bp, width);
			//for (int c = 0; c < jobList[jc].w; c++) {
			//	swp = matrix[col1+c];
			//	matrix[col1+c] = matrix[col2+c];
			//	matrix[col2+c] = swp;
			//}
		}
	}

	// Вывод данных
	//cout << "Конечная матрица: " << endl;
	for (int h = 0; h < matrixHeight; h++) {
		for (int w = 0; w < matrixWidth; w++) {
			printf("%d ", matrix[h * 1000 + w]);
		}
		printf("\n");
	}

	//system("pause");
	return 0;
}


package main

import (
	"strconv"
	"bufio"
	"os"
)

var scanner *bufio.Scanner
var writer *bufio.Writer

func getI64() int64 {
  scanner.Scan()
  x, _ := strconv.ParseInt(scanner.Text(), 10, 64)
  return x
}

func getI() int {
  return int(getI64())
}

func getS() string {
  scanner.Scan()
  return scanner.Text()
}

type Node struct {
	value int
	right *Node
	down *Node
}

func newNode(v int) *Node{
	return &Node{value: v}
}

func readMatrix (n, m int) *Node {
	//var root, currentNode, rowFirstNode *Node
	var matrix [][]*Node

	matrix = make([][]*Node, n+2, n+2)

	for colNo := 0; colNo < m + 2; colNo++ {
		matrix[0] = append(matrix[0], newNode(-1))

	}

	for rowNo := 1; rowNo < n+1; rowNo++ {
		matrix[rowNo] = append(matrix[rowNo], newNode(-1))
		for colNo := 1; colNo < m + 1; colNo++ {
			matrix[rowNo] = append(matrix[rowNo], newNode(getI()))
		}
		matrix[rowNo] = append(matrix[rowNo], newNode(-1))
	}

	for colNo := 0; colNo < m + 2; colNo++ {
		matrix[n+1] = append(matrix[n+1], newNode(-1))

	}

	for rowNo := 0; rowNo < n + 2; rowNo++ {
		for colNo := 0; colNo < m + 2; colNo++ {
			if colNo < m + 1 {
				matrix[rowNo][colNo].right = matrix[rowNo][colNo + 1]
			}
			if rowNo < n + 1 {
				matrix[rowNo][colNo].down = matrix[rowNo + 1][colNo]
			}
		}
	}

	return matrix[0][0]

}

func printMatrix(root *Node, n, m int) {
	var currentNode, rowFirst *Node
	rowFirst = root.right.down
	currentNode = rowFirst
	for rowFirst.value != -1 {
		for currentNode.value != -1 {
			writer.WriteString(strconv.Itoa(currentNode.value))
			currentNode = currentNode.right
			if currentNode.value != -1 {
				writer.WriteByte(' ')
			}
		}
		writer.WriteByte('\n')
		rowFirst = rowFirst.down
		currentNode = rowFirst
	}
}

func getXY(root *Node, x, y int) *Node{
	var node *Node
	node = root
	for i:=0; i < x; i++ {
		node = node.down
	}
	for i:=0; i < y; i++ {
		node = node.right
	}
	return node
}

func swap(a, b, c, d, h, w int, root *Node) {
	abNode := getXY(root, a - 1, b - 1)
	cdNode := getXY(root, c - 1, d - 1)

	abNodeVer := abNode
	cdNodeVer := cdNode

	for i:=0; i < h; i++ {
		abNodeVer = abNodeVer.down
		cdNodeVer = cdNodeVer.down
		abNodeVer.right, cdNodeVer.right = cdNodeVer.right, abNodeVer.right
	}

	abNodeHor := abNode
	cdNodeHor := cdNode

	for i:=0; i < w; i++ {
		abNodeHor = abNodeHor.right
		cdNodeHor = cdNodeHor.right
		abNodeHor.down, cdNodeHor.down = cdNodeHor.down, abNodeHor.down
	}

	abNodeVer, cdNodeVer = cdNodeVer.right, abNodeVer.right

	for i:=0; i < w; i++ {
		abNodeVer.down, cdNodeVer.down = cdNodeVer.down, abNodeVer.down
		cdNodeVer = cdNodeVer.right
		abNodeVer = abNodeVer.right
	}

	abNodeHor, cdNodeHor = cdNodeHor.down, abNodeHor.down

	for i:=0; i < h; i++ {
		abNodeHor.right, cdNodeHor.right = cdNodeHor.right, abNodeHor.right
		cdNodeHor = cdNodeHor.down
		abNodeHor = abNodeHor.down
	}

}

func main()  {
	var (
		m, n, q int
		root *Node
	)
	scanner = bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	writer = bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	n = getI()
	m = getI()
	q = getI()

	root = readMatrix(n, m)

	for i := 0; i < q; i++ {
		a, b, c, d, h, w := getI(), getI(), getI(), getI(), getI(), getI()
		swap(a, b, c, d, h, w, root)
	}

	printMatrix(root, n, m)
}


package main

import "bufio"
import "os"
import "strconv"

var in *bufio.Scanner
var out *bufio.Writer

type Node struct {
	val   int
	down  *Node
	right *Node
}

func create(v int) *Node {
	return &Node{
		val:   v,
		down:  nil,
		right: nil,
	}
}

const maxn = 1005

var n, m, q int
var a [maxn][maxn]*Node

func swap(i1 int, j1 int, i2 int, j2 int, h int, w int) {
	node1 := a[0][0]
	node2 := a[0][0]

	for ; i1 > 1; i1-- {
		node1 = node1.down
	}

	for ; j1 > 1; j1-- {
		node1 = node1.right
	}

	for ; i2 > 1; i2-- {
		node2 = node2.down
	}

	for ; j2 > 1; j2-- {
		node2 = node2.right
	}

	save1, save2 := node1, node2

	for k := 1; k <= w; k++ {
		node1, node2 = node1.right, node2.right
		node1.down, node2.down = node2.down, node1.down
	}

	node1, node2 = node2.down, node1.down
	for k := 1; k <= h; k++ {
		node1.right, node2.right = node2.right, node1.right
		node1, node2 = node1.down, node2.down
	}

	for k := 1; k <= h; k++ {
		save1, save2 = save1.down, save2.down
		save1.right, save2.right = save2.right, save1.right
	}

	save1, save2 = save2.right, save1.right
	for k := 1; k <= w; k++ {
		save1.down, save2.down = save2.down, save1.down
		save1, save2 = save1.right, save2.right
	}
}

func main() {
	in = bufio.NewScanner(os.Stdin)
	out = bufio.NewWriter(os.Stdout)

	in.Split(bufio.ScanWords)
	defer out.Flush()

	in.Scan()
	n, _ = strconv.Atoi(in.Text())

	in.Scan()
	m, _ = strconv.Atoi(in.Text())

	in.Scan()
	q, _ = strconv.Atoi(in.Text())

	for i := 0; i <= n+1; i++ {
		for j := 0; j <= m+1; j++ {
			a[i][j] = create(-1)
		}
	}

	for i := 0; i <= n; i++ {
		for j := 0; j <= m; j++ {
			a[i][j].down = a[i+1][j]
			a[i][j].right = a[i][j+1]
		}
	}

	for i := 1; i <= n; i++ {
		for j := 1; j <= m; j++ {
			in.Scan()
			a[i][j].val, _ = strconv.Atoi(in.Text())
		}
	}

	for k := 1; k <= q; k++ {
		in.Scan()
		i1, _ := strconv.Atoi(in.Text())
		in.Scan()
		j1, _ := strconv.Atoi(in.Text())
		in.Scan()
		i2, _ := strconv.Atoi(in.Text())
		in.Scan()
		j2, _ := strconv.Atoi(in.Text())
		in.Scan()
		h, _ := strconv.Atoi(in.Text())
		in.Scan()
		w, _ := strconv.Atoi(in.Text())
		swap(i1, j1, i2, j2, h, w)
	}

	row := a[0][1].down
	for i := 1; i <= n; i++ {
		col := row
		for j := 1; j <= m; j++ {
			out.WriteString(strconv.Itoa(col.val))
			if j < m {
				out.WriteByte(' ')
			}
			col = col.right
		}
		out.WriteByte('\n')
		row = row.down
	}

}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k,t1,t2;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                cnt+=(tmp-1)/(k+1)+1;
            }
        }
        t1=t2=0;
        if(num1.size()==1)
        {
            t1=(num1[0]-k-1-1)/(k+1)+1;
            if(n-num1[0]-k>0)
                t2=(n-num1[0]-k-1)/(k+1)+1;
            cout<<t1+t2<<'\n';
        }
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k,t1,t2;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                cnt+=(tmp-1)/(k+1)+1;
            }
        }
        t1=t2=0;
        if(num1.size()==1)
        {
            t1=(num1[0]-k-1-1)/(k+1)+1;
            if(num1[0]!=n)
                t2=(n-num1[0]-k-1)/(k+1)+1;
            cout<<t1+t2<<'\n';
        }
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                if((tmp-1)%(k+1)==0)
                    cnt+=(tmp-1)/(k+1)+1;
            }
        }
        if(num1.size()==1)
            cout<<(num1[0]-k-1-1)/k+1<<'\n';
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k,t1,t2;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                cnt+=(tmp-1)/(k+1)+1;
            }
        }
        t1=t2=0;
        if(num1.size()==1)
        {
            t1=(num1[0]-k-1-1)/(k+1)+1;
            if(num1[0]!=n)
                t2=(n-num1[0]+1-k-1)/(k+1)+1;
            cout<<t1+t2<<'\n';
        }
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k,t1,t2;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                cnt+=(tmp-1)/(k+1)+1;
            }
        }
        if(num1.size()==1)
        {
            t1=(num1[0]-k-1-1)/(k+1)+1;
            t2=(n-num1[0]-1-k-1)/(k+1)+1;
            cout<<t1+t2<<'\n';
        }
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                if((tmp-1)%k==0)
                    cnt+=(tmp-1)/k+1;
            }
        }
        if(num1.size()==1)
            cout<<(num1[0]-k-1-1)/k+1<<'\n';
        else if(num1.size()==0)
            cout<<max(((n-1)/k),1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                if((tmp-1)%(k+1)==0)
                    cnt+=(tmp-1)/(k+1)+1;
            }
        }
        if(num1.size()==1)
            cout<<(num1[0]-k-1-1)/(k+1)+1<<'\n';
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k,t1,t2;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        if(num1.size()==0)
        {
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
            continue;
        }
        t1=t2=0;
        if(num1.size()==1)
        {
            if(num1[0]-k-1-1>=0)
                t1=(num1[0]-k-1-1)/(k+1)+1;
            if(n-num1[0]-k>0)
                t2=(n-num1[0]-k-1)/(k+1)+1;
            cout<<t1+t2<<'\n';
            continue;
        }
        ll cnt=0;
        if(num1[0]-k-1-1>=0)
            cnt=(num1[0]-k-1-1)/(k+1)+1;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]-1>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                cnt+=(tmp-1)/(k+1)+1;
            }
        }
        if(n-num1[num1.size()-1]-k>0)
            cnt+=(n-num1[num1.size()-1]-k-1)/(k+1)+1;
        cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k,t1,t2;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        if(num1[0]-k-1-1>=0)
            cnt=(num1[0]-k-1-1)/(k+1)+1;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                cnt+=(tmp-1)/(k+1)+1;
            }
        }
        if(n-num1[num1.size()-1]-k>0)
            cnt+=(n-num1[num1.size()-1]-k-1)/(k+1)+1;
        t1=t2=0;
        if(num1.size()==1)
        {
            if(num1[0]-k-1-1>=0)
                t1=(num1[0]-k-1-1)/(k+1)+1;
            if(n-num1[0]-k>0)
                t2=(n-num1[0]-k-1)/(k+1)+1;
            cout<<t1+t2<<'\n';
        }
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
#define FOD(i,a,b) for(ll i=(a);i>=(b);--i)
#define name "a"
#define pb push_back
typedef pair < ll , ll > ii;
const ll maxn=2e5+7,oo=1e18,mod=1e9+7;
ll t,n,k,t1,t2;
string s;
vector < ll > num1;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen(name".inp","r",stdin);
    //freopen(name".out","w",stdout);
    #endif // ONLINE_JUDGE
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        cin>>s;
        s=" "+s;
        num1.clear();
        FOR(i,1,n)
            if(s[i]=='1')
                num1.pb(i);
        ll cnt=0;
        if(num1[0]-k-1-1>=0)
            cnt=(num1[0]-k-1-1)/(k+1)+1;
        for(int i=1;i<num1.size();++i)
        {
            if(num1[i]-num1[i-1]>2*k)
            {
                ll tmp=num1[i]-num1[i-1]-1-2*k;
                cnt+=(tmp-1)/(k+1)+1;
            }
        }
        if(n-num1[num1.size()-1]-k>0 && num1.size()>0)
            cnt+=(n-num1[num1.size()-1]-k-1)/(k+1)+1;
        t1=t2=0;
        if(num1.size()==1)
        {
            if(num1[0]-k-1-1>=0)
                t1=(num1[0]-k-1-1)/(k+1)+1;
            if(n-num1[0]-k>0)
                t2=(n-num1[0]-k-1)/(k+1)+1;
            cout<<t1+t2<<'\n';
        }
        else if(num1.size()==0)
            cout<<max((n-1)/(k+1)+1,1LL)<<'\n';
        else cout<<cnt<<'\n';
    }
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + (idx[1] - idx[0] - 1) / (2 * k + 1);
			//cout << "ans= " << ans << endl;
			for (long long int i = 1; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 1) / (2 * k + 1);
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + (idx[1] - idx[0] - 1) / (2 * k + 1);
			//cout << "ans= " << ans << endl;
			for (long long int i = 1; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 2) / (k + 1);
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + idx[1] / ( k + 1);

			for (long long int i = 1; i < idx.size(); i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 2) / (k + 1);
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + idx[1] / ( k + 1);

			for (long long int i = 1; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 2) / (k + 1);
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = 0;
			for (long long int i = 0; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans++;
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - idx.size()) / (k + 1);

		if (idx.size() != 1) {
			ans = 0;
			for (long long int i = 0; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans++;
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1);
			for (long long int i = 0; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans++;
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + (idx[1] - idx[0] - 2) / ( k + 1);
			//cout << "ans= " << ans << endl;
			for (long long int i = 1; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 2) / (k + 1);
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

/*int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + idx[1] / (k + 1);

			for (long long int i = 1; i < idx.size() - 1 ; i++) {
				//cout << i << endl;
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 1 - k) / (k + 1);
			}
		}

		cout << ans << endl;
	}
}*/

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		idx.push_back(n + k);
		//cout << t << " h1" << endl;
		//long long int ans = 1 + (n - 1) / (k + 1);
		long long int ans = 0;

		for (long long int i = 0; i < idx.size() - 1 ; i++) {
			//cout << i << endl;
			//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
			if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 1 - k) / (k + 1);
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + idx[1] / (k + 1);

			for (long long int i = 1; i < idx.size() - 1 ; i++) {
				//cout << i << endl;
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans = ans + (idx[i + 1] - idx[i] - 1-k) / (k + 1);
			}
		}

		cout << ans << endl;
	}
}


#include<bits/stdc++.h>
using namespace std;
#include<map>
#include<stack>
#include<vector>

float dist(int x1, int y1, int x2, int y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	int t;
	cin >> t;
	while (t--) {
		long long int n, k;
		cin >> n >> k;
		string s;
		cin >> s;
		vector<long long int> idx;
		idx.push_back(0 - k - 1);
		for (long long int i = 0; i < n; i++) {
			if (s[i] == '1') idx.push_back(i);
		}
		//cout << t << " h1" << endl;
		long long int ans = 1 + (n - 1) / (k + 1);

		if (idx.size() != 1) {
			ans = (n - 1 - idx[idx.size() - 1]) / (k + 1) + (idx[1] - idx[0]) / (2 * k + 1);
			//cout << "ans= " << ans << endl;
			for (long long int i = 1; i < idx.size() - 1; i++) {
				//cout  << idx[i + 1] << " " << idx[i] << " " << idx[i + 1] - idx[i] - 1 << " " << (2 * k) + 1 << endl;
				if (idx[i + 1] - idx[i] - 1 >= (2 * k) + 1) ans++;
			}
		}

		cout << ans << endl;
	}
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        int x = 0;
        while(x<=n-k){
            for(int y=x;y<x+k+1;y++){
                if(s[y]=='1'){
                    break;
                }
                else if(y==x+k){
                    count++;
                }
            }
            x = x + k + 1;
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()==0)count = 1;
            else count = 0;
        }
        else if(k==1){
            if(ans.size()==0){
                count = (n+k)/(k+1);
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y]-2)/(k+1));
                    y++;
                }
            }
        }
        else if(k>1){
            if(ans.size()==0){
                if(n%2==0)count = n/k;
                else count = n/(k+1);
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y])/(k+1));
                    y++;
                }
            }
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        int count1 = 0;
        int x = 0;
        while(x<n){
            if(s[x]=='0'){
                int y = x;
                while(s[y]=='0'){
                    y++;
                }

                if(x==0){
                    count = count + ((y-x-k)/k);
                }
                else if(y==n){
                    count = count + ((y-x-k)/k);
                }
                else{
                    if(y-x>=2*k)count = count + ((y-x-(2*k))/k);
                    else count = count + 0;
                }
                x = y;
            }
            else{
                count1++;
                x++;
            }
        }

        if(count1==0){
            count =  (n/(k+1)) + (n%(k+1) ? 1 : 0);
        }

        cout << count << '\n';
    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()>0){
                count = 0;
            }
            else{
                count = 1;
            }
        }
        else if(ans.size()>1){
            if(k!=1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + (ans[y+1]-ans[y])/(k+1);
                    y++;
                }
            }
            else if(k==1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + (ans[y+1]-ans[y])/(k+2);
                    y++;
                }
            }
        }
        else{
            if(k==1 && ans.size()!=0){
                count = n/(k+2);
            }
            else{
                count = n/(k+1);
            }
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()>0){
                count = 0;
            }
            else{
                count = 1;
            }
        }
        else if(ans.size()>1){
            if(k!=1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + (ans[y+1]-ans[y])/(k+1);
                    y++;
                }
            }
            else if(k==1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + (ans[y+1]-ans[y])/(k+2);
                    y++;
                }
            }
        }
        else{
            if(k==1){
                count = n/(k+2);
            }
            else{
                count = n/(k+1);
            }
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        int count1 = 0;
        int x = 0;
        while(x<n){
            if(s[x]=='0'){
                int y = x;
                while(s[y]=='0'){
                    y++;
                }

                if(x==0){
                    count = count + ((y-x-k)/k);
                }
                else if(y==n){
                    if(y-1-x>=k)count = count + ((y-1-x-k)/k);
                    else count = count + 0;
                }
                else{
                    if(y-x>=2*k)count = count + ((y-x-(2*k))/k);
                    else count = count + 0;
                }
                x = y;
            }
            else{
                count1++;
                x++;
            }
        }

        if(count1==0){
            count =  (n/(k+1)) + (n%(k+1) ? 1 : 0);
        }

        cout << count << '\n';
    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        int count1 = 0;
        int x = 0;
        while(x<n){
            if(s[x]=='0'){
                int y = x;
                while(s[y]=='0'){
                    y++;
                }

                if(x==0){
                    int temp = y-x-k;
                    if(y-x>k)count = count + (temp/(k+1) + (temp%(k+1) ? 1 : 0));
                    else count = count + 0;
                }
                else if(y==n){
                    int temp = y-x-k;
                    if(y-x>k)count = count + (temp/(k+1) + (temp%(k+1) ? 1 : 0));
                    else count = count + 0;
                }
                else{
                    int temp = y-x-(2*k);
                    if(y-x>2*k)count = count + (temp/(k+1) + (temp%(k+1) ? 1 : 0));
                    else count = count + 0;
                }
                x = y;
            }
            else{
                count1++;
                x++;
            }
        }

        if(count1==0){
            count =  (n/(k+1)) + (n%(k+1) ? 1 : 0);
        }

        cout << count << '\n';
    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()==0)count = 1;
            else count = 0;
        }
        else if(k==1){
            if(ans.size()==0){
                count = (n+k)/(k+1);
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y])/(k+2));
                    y++;
                }
            }
        }
        else if(k>1){
            if(ans.size()==0)count = n/(k+1);
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y])/(k+1));
                    y++;
                }
            }
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()==0)count = 1;
            else count = 0;
        }
        else if(k==1){
            if(ans.size()==0){
                count = (n+k)/(k+1);
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y]-2)/(k+1));
                    y++;
                }
            }
        }
        else if(k>1){
            if(ans.size()==0)count = n/(k+1);
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y])/(k+1));
                    y++;
                }
            }
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()>0){
                count = 0;
            }
            else{
                count = 1;
            }
        }
        else if(ans.size()>1){
            if(k!=1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + (ans[y+1]-ans[y])/(k+1);
                    y++;
                }
            }
            else if(k==1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + (ans[y+1]-ans[y])/(k+2);
                    y++;
                }
            }
        }
        else{
            count = n/(k+1);
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()==0)count = 1;
            else count = 0;
        }
        else if(k==1){
            if(ans.size()==0){
                count = (n+k)/(k+1);
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y]-2)/(k+1));
                    y++;
                }
            }
        }
        else if(k>1){
            if(ans.size()==0){
                if(n%(k+1)==0)count = n/(k+1);
                else count = n/(k+1) + 1;
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y]-2*k)/(k+1));
                    y++;
                }
            }
        }

        cout << count << '\n';

    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        int count1 = 0;
        int x = 0;
        while(x<n){
            if(s[x]=='0'){
                int y = x;
                while(s[y]=='0'){
                    y++;
                }

                if(x==0){
                    int temp = y-x-k;
                    count = count + (temp/(k+1) + (temp%(k+1) ? 1 : 0));
                }
                else if(y==n){
                    int temp = y-x-k;
                    if(y-x>k)count = count + (temp/(k+1) + (temp%(k+1) ? 1 : 0));
                    else count = count + 0;
                }
                else{
                    int temp = y-x-(2*k);
                    if(y-x>2*k)count = count + (temp/(k+1) + (temp%(k+1) ? 1 : 0));
                    else count = count + 0;
                }
                x = y;
            }
            else{
                count1++;
                x++;
            }
        }

        if(count1==0){
            count =  (n/(k+1)) + (n%(k+1) ? 1 : 0);
        }

        cout << count << '\n';
    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        int count1 = 0;
        int x = 0;
        while(x<n){
            if(s[x]=='0'){
                int y = x;
                while(s[y]=='0'){
                    y++;
                }

                if(x==0){
                    count = count + ((y-x-k)/k);
                }
                else if(y==n){
                    if(y-x>k)count = count + ((y-x-k)/k);
                    else count = count + 0;
                }
                else{
                    if(y-x>2*k)count = count + ((y-x-(2*k))/k);
                    else count = count + 0;
                }
                x = y;
            }
            else{
                count1++;
                x++;
            }
        }

        if(count1==0){
            count =  (n/(k+1)) + (n%(k+1) ? 1 : 0);
        }

        cout << count << '\n';
    }
}


#include <bits/stdc++.h>

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    for(int i=0;i<t;i++){
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;

        int count = 0;
        vector <int> ans;
        int x = 0;
        while(x<n){
            if(s[x]=='1')ans.push_back(x);
            x++;
        }

        if(n==k){
            if(ans.size()==0)count = 1;
            else count = 0;
        }
        else if(k==1){
            if(ans.size()==0){
                count = (n+k)/(k+1);
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y]-2)/(k+1));
                    y++;
                }
            }
        }
        else if(k>1){
            if(ans.size()==0){
                if(n%(k+1)==0)count = n/(k+1);
                else count = n/(k+1) + 1;
            }
            else if(ans.size()==1){
                count = ((ans[0]-0)/(k+1)) + ((n-1 - ans[0])/(k+1));
            }
            else if(ans.size()>1){
                int y = 0;
                while(y<ans.size()-1){
                    count = count + ((ans[y+1]-ans[y])/(k+1));
                    y++;
                }
            }
        }

        cout << count << '\n';

    }
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a/(b+1)!=0){
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1){
						con+=(pos[i]-pos[i-1]-1)/(b+1);
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis,con=0,mesas=0;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(a!=dis && cad==b){
			while(con!=a){
				if(con+dis+1>a){
					mesas++;
					break;
				}
				else{
					con+=dis+1;
					mesas++;
				}
			}
			cout<<mesas<<"\n";
		}
		else{
			for(int i=0;i<a;i++){
				if(cad[i]=='0'){
					con++;
					if(i==a-1){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
				}
				else{
					if(con==i){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								if(con-c2<dis){
									mesas--;
								}
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
					else{
						if(con-dis*2>0){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									if(con-c2<dis){
										mesas--;
									}
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}
					con=0;
				}
			}
			cout<<mesas<<endl;
		}
		test--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a%(b+1)!=0){
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1 && pos[i]-pos[i-1]-1>b*2){
						int resto=(pos[i]-pos[i-1]-1)-b*2;
						if(resto<b){
							con++;
						}
						else{
							for(int i=0;i<resto;i+=b+1){
								con++;
							}
						}
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				cout<<a/(b+1)<<"\n";
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1){
						con+=(pos[i]-pos[i-1]-1)/(b+1);
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis,con=0,mesas=0;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(a!=dis && cad==b){
			while(con!=a){
				if(con+dis+1>a){
					break;
				}
				else{
					con+=dis+1;
					mesas++;
				}
			}
			cout<<mesas<<"\n";
		}
		else{
			for(int i=0;i<a;i++){
				if(cad[i]=='0'){
					con++;
					if(i==a-1){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
				}
				else{
					if(con==i){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
					else{
						if(con-dis*2>0){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}
					con=0;
				}
			}
			cout<<mesas<<endl;
		}
		test--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a/(b+1)!=0){{
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1){
						con+=(pos[i]-pos[i-1]-1)/(b+1);
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int cas;
	cin>>cas;
	while(cas!=0){
		int tam,k,con=0;
		cin>>tam>>k;
		vector<char>table(tam);
		for(int i=0;i<tam;i++){
			cin>>table[i];
		}
		if(k==tam){
			con++;
		}
		for(int j=0;j<tam;j++){
			if(table[j]=='0' && table[j+k]=='0'){
				con++;
			}

			j+=k;
		}
		cout<<con<<"\n";
		cas--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int cas;
	cin>>cas;
	while(cas!=0){
		int tam,k,con=0;
		cin>>tam>>k;
		vector<char>table(tam);
		for(int i=0;i<tam;i++){
			cin>>table[i];
		}
		if(k==tam){
			con++;
		}
		for(int j=0;j<tam;j++){
			if(table[j]=='0'){
				int aux_k=k,aux_j=j+1,c=0;
				while(aux_k!=0 && table[aux_j]=='0'){
					aux_k--;
					aux_j++;
					c++;
				}
				if(j!=0){
					int aux_k2=k,aux_j2=j-1,c2=0;
					while(aux_k2!=0 && table[aux_j2]=='0'){
						aux_k2--;
						aux_j2--;
						c2++;
					}
					if(c==k && c2==k){
						table[j]='1';
						con++;
					}
				}
				else{
					if(c==k){
						table[j]='1';
						con++;
					}
				}

			}
		}
		cout<<con<<"\n";
		cas--;
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int cas;
	cin>>cas;
	while(cas!=0){
		int a,b,con=0;
		string pal;
		cin>>a>>b;
		cin.ignore();
		cin>>pal;
		if(a==b){
			int c=0;
			for(int i=0;i<a;i++){
				if(pal[i]=='0'){
					c++;
				}
			}
			if(c==a){
				con++;
			}
		}
		else{
			for(int i=0;i<a;i++){
				if(pal[i]=='0'){
					int c=0;
					while(pal[i]=='0'){
						i+=1;
						c++;
					}
					con+=c/(b+1);
					i-=1;
				}
			}
		}
		cout<<con<<"\n";
		cas--;
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis,con=0,mesas=0;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(a!=dis && cad==b){
			while(con!=a){
				if(con+dis+1>a){
					mesas++;
					break;
				}
				else{
					con+=dis+1;
					mesas++;
				}
			}
			cout<<mesas<<"\n";
		}
		else{
			for(int i=0;i<a;i++){
				if(cad[i]=='0'){
					con++;
					if(i==a-1){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
				}
				else{
					if(con==i){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								if(mesas!=0 && con-c2<dis){
									mesas--;
								}
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
					else{
						if(con-dis*2>0){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									if(mesas!=0 && con-c2<dis){
										mesas--;
									}
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}
					con=0;
				}
			}
			cout<<mesas<<endl;
		}
		test--;
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis,con=0,mesas=0;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(a!=dis && cad==b){
			while(con!=a){
				if(con+dis+1>a){
					mesas++;
					break;
				}
				else{
					con+=dis+1;
					mesas++;
				}
			}
			cout<<mesas<<"\n";
		}
		else{
			for(int i=0;i<a;i++){
				if(cad[i]=='0'){
					con++;
					if(i==a-1){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
				}
				else{
					if(con==i){
						con-=dis;
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
					else{
						if(con-dis*2>0){
							con-=dis;
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}
					con=0;
				}
			}
			cout<<mesas<<endl;
		}
		test--;
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(cad==b){
			if(dis==1){
				if(a%2==0){
					cout<<a/2<<"\n";
				}
				else{
					cout<<(a/2)+1<<"\n";
				}
			}
			else{
				int con=0,mesas=0;
				while(con!=a){
					if(a-con<dis+1){
						mesas++;
						break;
					}
					else{
						con+=dis+1;
						mesas++;
					}
				}
				cout<<mesas<<"\n";
			}
		}
		else{
			int mesas=0,con=0;
			if(cad[0]=='0'){
				int j = 0;
				while(cad[j]=='0'){
					j++;
				}
				while(con!=j){
					if(con+dis+1>j){
						break;
					}
					else{
						con+=dis+1;
						mesas++;
					}
				}
				con=0;
				for(int i=j;i<a;i++){
					if(cad[i]=='0'){
						con++;
						if(i==a-1){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}
					else{
						if(con-dis*2>0){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
						con=0;
					}
				}
			}
			else{
				for(int i=0;i<a;i++){
					if(cad[i]=='0'){
						con++;
						if(i==a-1){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}

					else{
						if(con-dis*2>0){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
						con=0;
					}
				}
			}
			cout<<mesas<<"\n";
		}
		test--;
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int cas;
	cin>>cas;
	while(cas!=0){
		int a,b,con=0;
		string pal;
		cin>>a>>b;
		cin.ignore();
		cin>>pal;

			for(int i=0;i<a;i++){
				if(pal[i]=='0'){
					int c=0;
					while(pal[i]=='0'){
						i+=1;
						c++;
					}
					con+=c/(b+1);
					i-=1;
				}
			}

		cout<<con<<"\n";
		cas--;
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(cad==b){
			if(dis==1){
				if(a%2==0){
					cout<<a/2<<"\n";
				}
				else{
					cout<<(a/2)+1<<"\n";
				}
			}
			else{
				if(a%2==0){
					cout<<a/dis<<"\n";
				}
				else{
					cout<<(a/dis)+1<<"\n";
				}
			}
		}
		else{
			int mesas=0,con=0;
			for(int i=0;i<a;i++){
				if(cad[i]=='0'){
					con++;
				}
				else{
					if(con-(dis*2)>=0){
						if(con-(dis*2)==0){
							mesas++;
						}
						else{
							mesas+=con-(dis*2);
						}
					}
					con=0;
				}
			}
			cout<<mesas<<"\n";
		}
		test--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a%(b+1)!=0){
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1 && (pos[i]-pos[i-1]-1)-b*2>0){
						int resto=(pos[i]-pos[i-1]-1)-b*2;
						if(resto<b){
							con++;
						}
						else{
							con+=resto/b;
						}
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a%(b+1)!=0){
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1 && (pos[i]-pos[i-1]-1)-b*2>0){
						int resto=(pos[i]-pos[i-1]-1)-b*2;
						if(resto<b){
							con++;
						}
						else{
							con+=resto/(b+1);
						}
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int cas;
	cin>>cas;
	while(cas!=0){
		int a,b,con=0;
		string pal;
		cin>>a>>b;
		cin.ignore();
		cin>>pal;
		if(a==b){
			bool can=true;
			for(int i=0;i<a;i++){
				if(pal[i]=='1'){
					can=false;
				}
			}
			if(can){
				cout<<"1\n";
			}
			else{
				cout<<"0\n";
			}
		}
		else{

			for(int i=0;i<a;i++){
				if(pal[i]=='0'){
					if(i==0){
						int aux=b,aux_i=i+1,c=0;;
						while(pal[aux_i]=='0' && aux!=0){
							c++;
							aux_i++;
							aux--;
						}
						if(c==b){
							pal[i]='1';
							con++;
						}
					}
				else{
					int aux=b,aux_i=i-1,c=0;;
					while(pal[aux_i]=='0' && aux!=0){
						c++;
						aux_i--;
						aux--;
					}
					int aux2=b,aux_i2=i-1,c2=0;;
					while(pal[aux_i2]=='0' && aux2!=0){
						c2++;
						aux_i2--;
						aux2--;
					}
					if(c==b && c2==b){
						pal[i]='1';
						con++;
						}
					}
				}

			}
			cout<<con<<"\n";
		}

		cas--;
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis,con=0,mesas=0;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(a!=dis && cad==b){
			con=0;

			while(con!=a){
				if(con+dis+1>a){
					mesas++;
					break;
				}
				else{
					con+=dis+1;
					mesas++;
				}
			}
			cout<<mesas<<"\n";
		}
		else{
			for(int i=0;i<a;i++){
				if(cad[i]=='0'){
					con++;
					if(i==a-1){
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
				}
				else{
					if(con==i){
						con-=dis;
						int c2=0;
						while(c2!=con){
							if(c2+dis+1>con){
								mesas++;
								break;
							}
							else{
								c2+=dis+1;
								mesas++;
							}
						}
					}
					else{
						if(con-dis*2>0){
							con-=dis*2;
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									mesas++;
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}
					con=0;
				}
			}
			cout<<mesas<<"\n";
		}
		test--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a%(b+1)!=0){
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1 && pos[i]-pos[i-1]-1>b*2){
						con+=(pos[i]-pos[i-1]-1)/(b+1);

					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(cad==b){
			if(dis==1){
				if(a%2==0){
					cout<<a/2<<"\n";
				}
				else{
					cout<<(a/2)+1<<"\n";
				}
			}
			else{
				cout<<a-(dis*2);
			}
		}
		else{
			int mesas=0,con=0;
			for(int i=0;i<a;i++){
				if(cad[i]=='0'){
					con++;
				}
				else{
					if(con-(dis*2)>=0){
						if(con-(dis*2)==0){
							mesas++;
						}
						else{
							mesas+=con-(dis*2);
						}
					}
					con=0;
				}
			}
			cout<<mesas<<"\n";
		}
		test--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a%(b+1)!=0){
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1 && pos[i]-pos[i-1]-1>b*2){
						int resto=(pos[i]-pos[i-1])-b*2;
						if((resto-1)<=b){
							con++;
						}
						else{
							con+=(resto-1)/(b+1);
						}
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int test;
	cin>>test;
	while(test!=0){
		int a,dis;
		string cad;
		string b="";
		cin>>a>>dis;
		cin>>cad;
		for(int i=0;i<a;i++){
			b+='0';
		}
		if(a==dis && cad == b){
			cout<<1<<"\n";
		}
		else if(cad==b){
			if(dis==1){
				if(a%2==0){
					cout<<a/2<<"\n";
				}
				else{
					cout<<(a/2)+1<<"\n";
				}
			}
			else{
				int con=0,mesas=0;
				while(con!=a){
					if(a-con<dis+1){
						mesas++;
						break;
					}
					else{
						con+=dis+1;
						mesas++;
					}
				}
				cout<<mesas<<"\n";
			}
		}
		else{
			int mesas=0,con=0;
			if(cad[0]=='0'){
				int j = 0;
				while(cad[j]=='0'){
					j++;
				}
				j-=1;
				while(con!=j){
					if(con+dis+1>j){
						break;
					}
					else{
						con+=dis+1;
						mesas++;
					}
				}
				con=0;
				for(int i=j+1;i<a;i++){
					if(cad[i]=='0'){
						con++;
						if(i==a-1){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}
					else{
						if(con-dis*2>0){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
						con=0;
					}
				}
			}
			else{
				for(int i=0;i<a;i++){
					if(cad[i]=='0'){
						con++;
						if(i==a-1){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
					}

					else{
						if(con-dis*2>0){
							int c2=0;
							while(c2!=con){
								if(c2+dis+1>con){
									break;
								}
								else{
									c2+=dis+1;
									mesas++;
								}
							}
						}
						con=0;
					}
				}
			}
			cout<<mesas<<"\n";
		}
		test--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int cas;
	cin>>cas;
	while(cas!=0){
		int tam,k,con=0;
		cin>>tam>>k;
		vector<char>table(tam);
		for(int i=0;i<tam;i++){
			cin>>table[i];
		}
		if(k==tam){
			con++;
		}
		for(int j=0;j<tam;j++){
			if(table[j]=='0'){
				int aux_k=k,aux_j=j+1,c=0;
				while(aux_k!=0 && table[aux_j]=='0'){
					aux_k--;
					aux_j++;
					c++;
				}
				if(j-k>=0){
					int aux_k2=k,aux_j2=j-1,c2=0;
					while(aux_k2!=0 && table[aux_j2]=='0'){
						aux_k2--;
						aux_j2--;
						c2++;
					}
					if(c==k && c2==k){
						table[j]='1';
						con++;
					}
				}
				else{
					if(c==k){
						table[j]='1';
						con++;
					}
				}

			}
		}
		cout<<con<<"\n";
		cas--;
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	int q;
	cin>>q;
	while(q--){
		int a,b;
		string c;
		cin>>a>>b>>c;

		vector<int>pos;
		for(int i=0;i<a;i++){
			if(c[i]=='1'){
				pos.push_back(i+1);
			}
		}
		if(pos.empty()){
			if(a==b){
			cout<<"1\n";
			}
			else{
				if(a%(b+1)!=0){
				cout<<(a/(b+1))+1<<"\n";
				}
				else{
					cout<<(a/(b+1))<<"\n";
				}
			}
			}
		else{
			if(pos.size()==1){

				cout<<(pos[0]-1)/(b+1) + (a-pos[0])/(b+1)<<"\n";
			}
			else{
				int con=0;
				if(pos[0]>1){
					con+=(pos[0]-1)/(b+1);
				}
				if(pos[pos.size()-1]!=a){
					con+=(a-pos[pos.size()-1])/(b+1);
				}
				for(int i=1;i<pos.size();i++){
					if(pos[i]-pos[i-1]!=1 && (pos[i]-pos[i-1]-1-(b*2))>0){
						int resto=(pos[i]-pos[i-1]-1)-b*2;
						if(resto<=b){
							con++;
						}
						else{
							con+=resto/(b+1);
						}
					}
				}
				cout<<con<<"\n";
			}
		}
	}
	return 0;
}