Not sure that what bugs you was what bugged me, but...
#!/usr/bin/perl
use strict;
use warnings;
# Faked input
my $N = 5;
my $M = 9999997;
# Compute the sizes of the ranges
$M += 1;
my $step = int $M / $N;
my $extra = $M - $N * $step;
my(@sizes) = ($step) x $N;
@sizes = map { ($extra-- > 0) ? $_ + 1 : $_ } @sizes;
# Generate the ranges
my @ranges = ([undef, -1]);
for my $size (@sizes) {
my $m = $ranges[-1][1];
push( @ranges, [ $m + 1, $m + $size ] );
}
shift @ranges;
# Output
printf "%2d : from %7d to %7d (%7d)\n",
$_, @{ $ranges[ $_ ] },
$ranges[ $_ ][ 1 ] - $ranges[ $_ ][ 0 ] + 1
for 0 .. $#ranges;
This produces:
0 : from 0 to 1999999 (2000000)
1 : from 2000000 to 3999999 (2000000)
2 : from 4000000 to 5999999 (2000000)
3 : from 6000000 to 7999998 (1999999)
4 : from 7999999 to 9999997 (1999999)