#include <cstddef>
#include <iostream>
#include <stdexcept>
#include <vector>
std::size_t verify(std::size_t n,std::size_t block) {
    if(block==0) throw std::invalid_argument("block");
    const auto grid=n/block+(n%block!=0?1:0);
    std::vector<int> visits(n,0);
    for(std::size_t b=0;b<grid;++b) for(std::size_t lane=0;lane<block;++lane) {
        const auto i=b*block+lane;if(i<n) ++visits[i];
    }
    for(int count:visits) if(count!=1) throw std::runtime_error("coverage");
    return grid;
}
int main() {
    for(std::size_t n=0;n<=100;++n) for(std::size_t b=1;b<=32;++b) {
        const auto grid=verify(n,b);
        if(grid*b<n || (grid>0 && (grid-1)*b>=n))
            throw std::runtime_error("minimal covering grid");
    }
    bool rejected=false;
    try {
        const auto unexpected=verify(1,0);
        std::cout<<"unexpected zero-block grid="<<unexpected<<'\n';
        return 1;
    } catch(const std::invalid_argument&){rejected=true;}
    if(!rejected || verify(10,4)!=3) throw std::runtime_error("launch");
    std::cout<<"grid=3 launched=12 active=10\n";
}
