Description
欧洲人托米非常喜欢数字,他经常在空闲时玩下面的游戏
对于一个数字 nnn, 托米会随性选中一个数 ppp,(1<p≤n)(1< p \le n)(1<p≤n), 将nnn拆分成 u=⌊np⌋,v=n−uu=\lfloor\frac{n}{p}\rfloor,v=n-uu=⌊pn⌋,v=n−u,并对 u,vu,vu,v 重复这个过程,直到他有了nnn个111
131713171317为了挑战托米,在每次托米进行划分时,会给托米奖励u⋅vu \cdot vu⋅v 的分数,托米希望你能帮他最大化他的得分。
Input
第一行一个正整数TTT,下面$ T 行每行一个正整数行每行一个正整数行每行一个正整数 n$
(T≤104,n≤109)(T\le 10^4,n\le 10^9)(T≤104,n≤109)
Output
对于每组数据,输出托米的最大得分
Sample Input
1 5
Sample Output
10
Solution
求出较小nnn的答案后归纳法证明ans(n)=n(n−1)2ans(n)=\frac{n(n-1)}{2}ans(n)=2n(n−1),假设该结论对于所有k<nk<nk<n均成立,那么有
ans(n)=u(n−u)+u(u−1)2+(n−u)(n−u−1)2=n2−n2ans(n)=u(n-u)+\frac{u(u-1)}{2}+\frac{(n-u)(n-u-1)}{2}=\frac{n^2-n}{2}ans(n)=u(n−u)+2u(u−1)+2(n−u)(n−u−1)=2n2−n,故结论对任意nnn成立
Code
#include<cstdio>
using namespace std;
typedef long long ll;
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%lld\n",(ll)n*(n-1)/2);
}
return 0;
}