【考查点】数论
【思路】题目的要求实际上是将一个数分解成若干个不相同的正整数之和,求出使得这些整数有最大积的数列。对于一个数分解成两个数之和时,当这两个数相等或者相差最小时有最大积。如6=3+3,最大是3*3=9.因为题目要求整数不相等,所以是2*4=8。同理,将一个数分解成多个数之和时,相邻的整数之间差值最小时,整个数列的乘积最大。为此可以将一个数n从2,3,。。。开始分解,直到某个大于或者等于n的剩余值k,在余数k不为0时,在2,3,4...N的序列中找到最小的i满足(i+k)〉N,然后用i+k替换掉i就可以了。
【参考】http://acm.pku.edu.cn/JudgeOnline/bbs?problem_id=1032
- #include<iostream>
- #include<string>
- using namespace std;
- int main()
- {
- int n;
- cin>>n;
- int i=2;
- for(i=2;i<=n;i++) n-=i;
- i--;
- bool b=true;
- for(int j=2;j<=i;j++)
- {
- if(b&&j+n>i)
- {
- b=!b;
- n=j+n;
- continue;
- }
- cout<<j<<" ";
- }
- if(!b)
- cout<<n<<endl;
- return 0;
- }