题目描述
牛牛刚开始有一个正整数n。 每次操作牛牛可以选择一个自己有的数字x,把x分为两正整数y和z,需满足x=y+z,然后获得y*z的收益。 (当然,在这个过程中,牛牛会失去x这个数字,并且获得y和z这2个数字。) 牛牛一共可以分k次,牛牛希望最大化这k次的收益之和。 因为分割的结果y和z是正整数,所以选择的x必须>=2。
对于100%的数据,1 <= k < n <= 109
对于40%的数据,1 <= k < n <= 10
对于70%的数据,1 <= k < n <= 100
输入描述:
输入只有一行,包含用空格分开的两个整数,表示n和k。
输出描述:
输出一行一个整数,表示答案。
示例1
输入
9 2
输出
27
说明
刚开始牛牛有{9}
把9分为3和6,牛牛现在有{6, 3}
把6分为3和3,牛牛现在有{3, 3, 3}
总收益为63+33 = 27。
思路
注意到得分只和开始局面,结束局面有关刚开始n,最后如果是a[0], a[2], …, a[k]共k+1块的话收益一定是n*(n-1)/2 - a[0](a[0]-1)/2 - a[1](a[1]-1)/2 … - a[k]*(a[k]-1)/2然后如果最后有k+1个数字那么最大的数字,和最小的数 字,差至多是1。直接计算答案即可。
代码
#include<bits/stdc++.h>
using namespace std;
long long n,k,i,p,ans;
int main()
{
scanf("%lld%lld",&n,&k);
p=k+1;
for(i=1;i<=k;i++)
{
ans+=(n/p)*(n-n/p);
n-=n/p;
p--;
}
printf("%lld\n",ans);
return 0;
}
来源:nkw