分则能成 [思维题]

分 则 能 成 分则能成



最 初 想 法 \color{blue}{最初想法}

发现大多数情况下将数字 n n n分作 n / 2 − 1 n/2-1 n/21, n / 2 n/2 n/2, 或 n / 2 + 1 n/2+1 n/2+1 结果最优,
然后最后一次分解直接分作 n / 2 n/2 n/2 .


正 解 部 分 \color{red}{正解部分}

最终 一定分成 K + 1 K+1 K+1 个数字, 设为 a 1 , a 2 , a 3 . . . a m a_1, a_2, a_3...a_m a1,a2,a3...am,


发现 a i a_i ai 之间恰好每个之间都乘了一次 累加后得到答案 .

于是答案为 1 2 ∑ i = 1 m a i ∗ ( N − a i ) \frac{1}{2}\sum\limits_{i=1}^ma_i*(N-a_i) 21i=1mai(Nai) , 可以证明当 a i a_i ai 最平均时答案最大 .

m = K + 1 m = K+1 m=K+1


实 现 部 分 \color{red}{实现部分}

现将 N N N 分为 K + 1 K+1 K+1 份, 然后将 N % ( K + 1 ) N\%(K+1) N%(K+1) 平均分布到这 K + 1 K+1 K+1 份中 .

#include<bits/stdc++.h>
typedef long long ll;

ll N;
ll K;

int main(){
        freopen("Split.in", "r", stdin);
        freopen("Split.out", "w", stdout);
        scanf("%lld%lld", &N, &K);
        ll Ans = (K+1-N%(K+1)) * (N/(K+1)) * (N - N/(K+1));
        Ans += (N%(K+1))*(N/(K+1)+1)*(N-N/(K+1)-1);
        printf("%lld\n", Ans >> 1);
        return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值