//写在前面:手抖,MinGW里删除汉字要两次。外加,参考了别人的写法,啊,好机智啊。
题面:一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
输入是一个正整数n在3到10000之间,拆分之后累乘起来蛮大的要高精,然后long long只能过三个点,看那一大堆带﹣号的输出很吓人。
恩本来没仔细看题目,以为就是拆分然后乘积最大,于是就拆成很多很多小质数……2,3之类的==,最后跟乘方那样很大。。
然后发现是拆分成不同的数。啊,不同的,这……
一脸懵逼。
然后找规律,找规律
设f(x)是拆分后的最大乘积。
3=1+2 f(3)=2;
4=2+2 f(4)=4;
5=2+3 f(5)=6;
6=2+4 f(6)=8;
7=3+4 f(7)=12;
8=3+5 f(8)=15;
9=2+3+4 f(9)=24;
10=2+3+5 f(10)=30;
11=2+4+5 f(11)=40;
……
啊没规律啊……
看看分类,贪心,高精和数学。
啊贪心!
还是不知道怎么写。。。
翻一下题解和别人的代码好了。
看不懂。。。真的,到现在我还没看懂那个代码。。
好,题解,看题解。
只好顺着这个思路走,先证明,5以上的数x分解之后总有一种情况使得积大于x
首先设这个数是x,设0<a<=2/x;
那么就是,a和x-a
s=a*(x-a)
要证明s-x>0
则s-x=a*(x-a)-x=ax-a^2-x,提取公因数x,x(a-1)-a^2;
因为刚刚设0<a<=2/x;
所以x>=2a;
所以2a(a-1)-a^2=a2^2-a^2-2a=a^2-2a,之前说了是5以上的数,所以a^2-2a真的>0;
……
不想写了,明天再写……