I don't know how to do this mathematically, but you can do it programmatically: use the Sieve of Eratosthenes to generate factor counts from 1 to $10^{10}-1$. Note that $10^{10}$ is a bit over $2^{33}$ so you won't be able to store this in memory on a conventional computer (one byte per entry means you'd need 9.3 GB of RAM just for the array). There are some time-memory trade-offs here that could keep you off the disk, and there are ways to parallelize some of this, but it's still not something you can easily figure out on a commodity computer (unless there is a better method).
I ran a C program for 10-digit numbers and obtained the following counts:
01: 455052511 02: 1493776443 03: 2227121996 04: 2139236881 05: 1570678136 06: 977694273 07: 550454756 08: 291646797 09: 148930536 10: 74342563 11: 36585097 12: 17836903 13: 8641282 14: 4167745 15: 2002277 16: 959377 17: 458176 18: 218163 19: 103657 20: 49031 21: 23133 22: 10837 23: 5091 24: 2349 25: 1089 26: 499 27: 224 28: 102 29: 44 30: 19 31: 7 32: 3 33: 1
This table gives the counts for each $s_i$ for $1 \leq i \leq 33$ where integers are between 2 and $10^{10} - 1$. Prime multiplicities are counted, as you specified in a comment.
This ran in about 12 minutes on an x86 using 10 GB of RAM. So the answer to your question is that $s_3$ is largest. Code posted below.
#include #include #define MAX 10000000000 // sieve size #define PPOWER 255 // marker for prime powers // allocate MAX bytes of memory unsigned char sieve[MAX]; // use # of factors as index, # of ints is value unsigned long tally[100]; // sieve[] is initialized to all 0's; then for each i, sieve[i] will contain // the number of prime factors (including multiplicity) for each i, except // sieve[p^j] for prime p, j >1 will contain the special marker PPOWER. // We do this to properly account for prime multiplicities. main() { unsigned long i, j; int c; for (i=2; i < MAX; i++) { if (sieve[i] != PPOWER) { // if composite, tally and continue if (sieve[i] > 0) { tally[sieve[i]]++; continue; } // ok, i is prime; tally and mark all prime powers as PPOWER // (takes some thought to see why we do this) tally[1]++; j = i*i; c = 2; while (j < MAX) { sieve[j] = PPOWER; tally[c]++; j = j * i; c++; } } // now sieve as usual for (j=i*2; j < MAX; j += i) { if (sieve[j] != PPOWER) sieve[j]++; } } for (c=1; c < 100; c++) if (tally[c]) printf("%.2d: %ld\n", c, tally[c]); }