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

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

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

Description

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

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

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

Input

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

( T ≤ 1 0 4 , n ≤ 1 0 9 ) (T\le 10^4,n\le 10^9) (T104,n109)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值