It is a little tricky, but the code below works in the default theme:
<?php $max_first_page = 3; // Show this many posts on front page
$args = $wp_query->query;
$args['caller_get_posts'] = 1; // Using stickies messes up the count
$page = (get_query_var('paged')) ? get_query_var('paged') : 1;
$posts_per_page = get_query_var('posts_per_page');
$posts_to_skip = $posts_per_page - $max_first_page;
if ($page == 1) {
$max_posts = $max_first_page;
} else {
$max_posts = $posts_per_page;
$args['offset'] = (($page - 1) * $max_posts)- $posts_to_skip;
}
query_posts($args);
if ($wp_query->max_num_pages < ceil(($wp_query->found_posts + $posts_to_skip)/$posts_per_page))
++$wp_query->max_num_pages;
$counter = 0;
?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<?php if (++$counter > $max_posts) continue; ?>
// Rest of the loop
Note: Set Admin->Settings->Reading->’Blog pages show at most’ to the number to show on pages other than the first.