这题做了挺久了,考察的东西还挺多,而且还是一道思维题。
原题链接:HDU - 5976
华师男和他女票又创造了一个新的游戏
他们一起想一个数x,然后对这个进行拆分成任意多个 各不相同的数, a1,a2,a3 … 满足(x= a1+a2+a3+…) 他们决定齐心协力找到一种拆分方法,使得所有这些数的乘积最大。
Input
第一行有一个整数T,表示有T组测试数据。
随后T行,每行都有一个数字x。
1≤T≤10^6, 1≤x≤10^9
Output
先获取乘积的最大值,再对其模10^9+7后输出。
Sample Input
2
4
5
Sample Output
4
6
Hint
4 = 4
5 = 2 + 3,2*3 = 6
代码如下:
|
|
尽量将X拆成2+3+4……+k,如果x恰好能拆成,则答案就是k!如果x拆完还剩t,则将X拆为2+3+……+(k-t) + (k–t+2)+(k–t+3)+……+k+(k+1);通过预处理可以得出(k+1)!只需乘上(k – t + 1)的逆元。
此外有个特例,如果减到最后剩下的数和最后一个数一样大,多出来的一就加在最后一个数上面。
PS:原来一般的数组也可以用STL二分。。。
附上逆元的公式 (要求MOD为素数):
|
|
更多关于逆元的知识: http://blog.csdn.net/xwxcy/article/details/51493193