#include <vector>
#include <algorithm>
#include <iostream>
int width;
int blockSize;
static std:: vector < double > memoize;
double pStdCap( int n, int m, int myMax) {
if ( myMax * m < n || n < m) return 0 ;
if ( myMax * m == n || n <= m + 1 ) return 1 ;
if ( m < 2 ) return m;
const int block = myMax * blockSize + ( n - m) * width + m - 2 ;
if ( memoize[ block] ) return memoize[ block] ;
int niter = n / m;
if ( m == 2 ) {
if ( myMax * 2 >= n) {
myMax = std:: min ( myMax, n - 1 ) ;
return niter - ( n - 1 - myMax) ;
} else {
return 0 ;
}
}
double count = 0 ;
for ( ; niter-- ; n - = m, -- myMax) {
count + = ( memoize[ myMax * blockSize + ( n - m) * width + m - 3 ] = pStdCap( n - 1 , m - 1 , myMax) ) ;
}
return count;
}
double CountPartLenCap( int n, int m, int myMax) {
if ( myMax * m < n || n < m) return 0 ;
if ( myMax * m == n || n <= m + 1 ) return 1 ;
if ( m < 2 ) return m;
if ( m == 2 ) {
if ( myMax * 2 >= n) {
myMax = std:: min ( myMax, n - 1 ) ;
return n / m - ( n - 1 - myMax) ;
} else {
return 0 ;
}
}
width = m;
blockSize = m * ( n - m + 1 ) ;
memoize = std:: vector < double > ( ( myMax + 1 ) * blockSize, 0.0 ) ;
return pStdCap( n, m, myMax) ;
}
int main( ) {
std:: cout << "Here are the 5 4-length partitions of 10 with a max of 4\n " ;
std:: cout << "1, 1, 4, 4\n 1, 2, 3, 4\n " ;
std:: cout << "1, 3, 3, 3\n 2, 2, 2, 4\n " ;
std:: cout << "2, 2, 3, 3\n The function properly returns 5\n " ;
std:: cout << CountPartLenCap( 10 , 4 , 4 ) << std:: endl ;
std:: cout << "The function instantly returns the number of 15-length partitions of 100 with a max of 15\n " ;
std:: cout << CountPartLenCap( 100 , 15 , 15 ) << std:: endl ;
std:: cout << "While the below computes without exceeding the time limit, it probably isn't very useful\n " ;
std:: cout << CountPartLenCap( 10000 , 40 , 300 ) << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IHdpZHRoOwppbnQgYmxvY2tTaXplOwpzdGF0aWMgc3RkOjp2ZWN0b3I8ZG91YmxlPiBtZW1vaXplOwoKZG91YmxlIHBTdGRDYXAoaW50IG4sIGludCBtLCBpbnQgbXlNYXgpIHsKICAgIAogICAgaWYgKG15TWF4ICogbSA8IG4gfHwgbiA8IG0pIHJldHVybiAwOwogICAgaWYgKG15TWF4ICogbSA9PSBuIHx8IG4gPD0gbSArIDEpIHJldHVybiAxOwogICAgaWYgKG0gPCAyKSByZXR1cm4gbTsKICAgIAogICAgY29uc3QgaW50IGJsb2NrID0gbXlNYXggKiBibG9ja1NpemUgKyAobiAtIG0pICogd2lkdGggKyBtIC0gMjsKICAgIGlmIChtZW1vaXplW2Jsb2NrXSkgcmV0dXJuIG1lbW9pemVbYmxvY2tdOwogICAgCiAgICBpbnQgbml0ZXIgPSBuIC8gbTsKICAgIAogICAgaWYgKG0gPT0gMikgewogICAgICAgIGlmIChteU1heCAqIDIgPj0gbikgewogICAgICAgICAgICBteU1heCA9IHN0ZDo6bWluKG15TWF4LCBuIC0gMSk7CiAgICAgICAgICAgIHJldHVybiBuaXRlciAtIChuIC0gMSAtIG15TWF4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGRvdWJsZSBjb3VudCA9IDA7CiAgICAKICAgIGZvciAoOyBuaXRlci0tOyBuIC09IG0sIC0tbXlNYXgpIHsKICAgICAgICBjb3VudCArPSAobWVtb2l6ZVtteU1heCAqIGJsb2NrU2l6ZSArIChuIC0gbSkgKiB3aWR0aCArIG0gLSAzXSA9IHBTdGRDYXAobiAtIDEsIG0gLSAxLCBteU1heCkpOwogICAgfQogICAgCiAgICByZXR1cm4gY291bnQ7Cn0KCmRvdWJsZSBDb3VudFBhcnRMZW5DYXAoaW50IG4sIGludCBtLCBpbnQgbXlNYXgpIHsKICAgIAogICAgaWYgKG15TWF4ICogbSA8IG4gfHwgbiA8IG0pIHJldHVybiAwOwogICAgaWYgKG15TWF4ICogbSA9PSBuIHx8IG4gPD0gbSArIDEpIHJldHVybiAxOwogICAgaWYgKG0gPCAyKSByZXR1cm4gbTsKICAgIAogICAgaWYgKG0gPT0gMikgewogICAgICAgIGlmIChteU1heCAqIDIgPj0gbikgewogICAgICAgICAgICBteU1heCA9IHN0ZDo6bWluKG15TWF4LCBuIC0gMSk7CiAgICAgICAgICAgIHJldHVybiBuIC8gbSAtIChuIC0gMSAtIG15TWF4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHdpZHRoID0gbTsKICAgIGJsb2NrU2l6ZSA9IG0gKiAobiAtIG0gKyAxKTsKICAgIG1lbW9pemUgPSBzdGQ6OnZlY3Rvcjxkb3VibGU+KChteU1heCArIDEpICogYmxvY2tTaXplLCAwLjApOwogICAgCiAgICByZXR1cm4gcFN0ZENhcChuLCBtLCBteU1heCk7Cn0KCmludCBtYWluKCkgewoJc3RkOjpjb3V0IDw8ICJIZXJlIGFyZSB0aGUgNSA0LWxlbmd0aCBwYXJ0aXRpb25zIG9mIDEwIHdpdGggYSBtYXggb2YgNFxuIjsKCXN0ZDo6Y291dCA8PCAiMSwgMSwgNCwgNFxuMSwgMiwgMywgNFxuIjsKCXN0ZDo6Y291dCA8PCAiMSwgMywgMywgM1xuMiwgMiwgMiwgNFxuIjsKCXN0ZDo6Y291dCA8PCAiMiwgMiwgMywgM1xuVGhlIGZ1bmN0aW9uIHByb3Blcmx5IHJldHVybnMgNVxuIjsKCXN0ZDo6Y291dCA8PCBDb3VudFBhcnRMZW5DYXAoMTAsIDQsIDQpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiVGhlIGZ1bmN0aW9uIGluc3RhbnRseSByZXR1cm5zIHRoZSBudW1iZXIgb2YgMTUtbGVuZ3RoIHBhcnRpdGlvbnMgb2YgMTAwIHdpdGggYSBtYXggb2YgMTVcbiI7CglzdGQ6OmNvdXQgPDwgQ291bnRQYXJ0TGVuQ2FwKDEwMCwgMTUsIDE1KSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIldoaWxlIHRoZSBiZWxvdyBjb21wdXRlcyB3aXRob3V0IGV4Y2VlZGluZyB0aGUgdGltZSBsaW1pdCwgaXQgcHJvYmFibHkgaXNuJ3QgdmVyeSB1c2VmdWxcbiI7CglzdGQ6OmNvdXQgPDwgQ291bnRQYXJ0TGVuQ2FwKDEwMDAwLCA0MCwgMzAwKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==
stdout
Here are the 5 4-length partitions of 10 with a max of 4
1, 1, 4, 4
1, 2, 3, 4
1, 3, 3, 3
2, 2, 2, 4
2, 2, 3, 3
The function properly returns 5
5
The function instantly returns the number of 15-length partitions of 100 with a max of 15
927060
While the below computes without exceeding the time limit, it probably isn't very useful
3.21315e+37