當前位置: 華文星空 > 心靈

acm哪些腦洞令人嘆為觀止?

2016-05-09心靈

昨天學習杜教程式碼的時候看到了一個黑科技(先上程式碼讓大家感受一下)

VI gao ( int n ) { VI ret ( p + 1 , 0 ); if ( n == 0 ) { ret [ 0 ] = 1 ; } else if ( n % 2 == 0 ) { VI c = gao ( n / 2 ); rep ( i , 0 , p + 1 ) rep ( j , 0 , p + 1 ) if ( i + j <= p ) ret [ i + j ] += c [ i ] * c [ j ]; } else { VI c = gao ( n - 1 ); rep ( i , 0 , p + 1 ) rep ( j , 0 , 2 ) if ( i + j <= p ) ret [ i + j ] += c [ i ]; } return ret ; }

這段程式碼返回一個vector,其第i項是C_n^i


我們知道求C_n^i 有一個經典的遞推的方法:C_n^i = C_n^{i - 1} * \frac{n - i + 1} {i}

這種方法因為有除法,在要模的數是一個合數的時候就不適用了

此時,通常的做法就是根據上述公式每次暴力求i和前面那些項的gcd,然後除掉,我也一直是這樣寫的,

直到昨天看到杜教的程式碼……