Description
欧洲人托米非常喜欢数字,他经常在空闲时玩下面的游戏
对于一个数字 n n n, 托米会随性选中一个数 p p p, ( 1 < p ≤ n ) (1< p \le n) (1<p≤n), 将 n n n拆分成 u = ⌊ n p ⌋ , v = n − u u=\lfloor\frac{n}{p}\rfloor,v=n-u u=⌊pn⌋,v=n−u,并对 u , v u,v u,v 重复这个过程,直到他有了 n n n个 1 1 1
1317 1317 1317为了挑战托米,在每次托米进行划分时,会给托米奖励 u ⋅ v u \cdot v u⋅v 的分数,托米希望你能帮他最大化他的得分。
Input
第一行一个正整数 T T T,下面$ T 行 每 行 一 个 正 整 数 行每行一个正整数 行每行一个正整数 n$
( T ≤ 1 0 4 , n ≤ 1 0 9 ) (T\le 10^4,n\le 10^9) (T≤104,n≤109)
Output
对于每组数据,输出托米的最大得分
Sample Input
1 5
Sample Output
10
Solution
求出较小 n n n的答案后归纳法证明 a n s ( n ) = n ( n − 1 ) 2 ans(n)=\frac{n(n-1)}{2} ans(n)=2n(n−1),假设该结论对于所有 k < n k<n k<n均成立,那么有
a n s ( n ) = u ( n − u ) + u ( u − 1 ) 2 + ( n − u ) ( n − u − 1 ) 2 = n 2 − n 2 ans(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,故结论对任意 n n n成立
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;
}