Newcoder 156 B.托米的划分(打表)

本文探讨了一个有趣的数学问题,欧洲人托米在空闲时玩的一个数字游戏,通过不断拆分数字并计算特定分数,目标是最大化得分。文章提供了问题的输入输出格式,示例以及解决方案,证明了得分公式为n(n-1)/2,并附带了实现这一策略的C++代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

欧洲人托米非常喜欢数字,他经常在空闲时玩下面的游戏

对于一个数字 nnn, 托米会随性选中一个数 ppp,(1<p≤n)(1< p \le n)(1<pn), 将nnn拆分成 u=⌊np⌋,v=n−uu=\lfloor\frac{n}{p}\rfloor,v=n-uu=pn,v=nu,并对 u,vu,vu,v 重复这个过程,直到他有了nnn111

131713171317为了挑战托米,在每次托米进行划分时,会给托米奖励u⋅vu \cdot vuv 的分数,托米希望你能帮他最大化他的得分。

Input

第一行一个正整数TTT,下面$ T 行每行一个正整数行每行一个正整数 n$

(T≤104,n≤109)(T\le 10^4,n\le 10^9)(T104,n109)

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(n1),假设该结论对于所有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(nu)+2u(u1)+2(nu)(nu1)=2n2n,故结论对任意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;
} 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值