hdu5646(数学)
2024-08-26 06:23:02
小学数学,脑补
一开始看到这题,猜了个规律想写但是我是拒绝的。
因为我无法证明。
好吧,主要还是小学数学没学好吧。
要理解这题,首先得搞懂一个重要问题。假设C=A+B,怎样选择两个正整数使得A*B最大?
学过小学数学的人都知道,A=C/2,B=C-A。 为啥是这样的。我在做这题之前好像就没搞太明白。
对于A+2<=B,
(A+1)(B-1) = AB+B-A-1>AB
所以对于任意选择的两个A,B都死通过调整得到A=C/2,B=C-A
推广一下,现在是对于多个数,A1,A2,A3,...,Ak
且A1+A2+A3+...+Ak=n
使得A1*A2*A3*...*Ak最大。 我们发现完全可以当成若干个C=A+B问题来解。
把大的调小,把小的调大。最后得到的一定是一段连续数字,或者两段连续数字中间只间隔1个数。
如:234567
234678
然后这题就是一个10几行代码的模拟了。
//
// main.cpp
// bc76
//
// Created by 陈加寿 on 16/3/19.
// Copyright © 2016年 chenhuan001. All rights reserved.
// #include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std; #define MOD 1000000007 long long save[]; int main(int argc, const char * argv[]) {
int T;
cin>>T;
while(T--)
{
long long n,k;
cin>>n>>k;
if(k*(k+)/>n)
{
printf("-1\n");
continue;
}
long long x = (n - k*(k-)/)/k;
for(int i=;i<=k;i++)
save[i] = x+i-;
long long last = (n - k*(k-)/)%k;
for(int i=;i<last;i++)
save[k-i]++;
long long ans=;
for(int i=;i<=k;i++)
ans = (ans*save[i])%MOD;
cout<<ans<<endl;
}
return ;
}
最新文章
- Android学习十一:高德地图使用
- .NET 平台下的插件化开发内核(Rabbit Kernel)-转
- SpringMVC使用中遇到的问题总结
- Centos下使用gitosis配置管理git服务端(转载)
- Google Code Pretiffy 代码 着色 高亮 开源 javascript(JS)库
- Android串口通信(基于Tiny6410平台)
- delphi Sender和Tag的用法
- 算法导论学习-RED-BLACK TREE
- Sublime Text 3 乱码解决
- Angular - - $compile编译服务与指令
- [bzoj4873]寿司餐厅
- Image中的alt
- 开启Apache的server status监测
- Scala多重继承及AOP
- vue中的provide/inject的学习
- Bootstrap3实现的响应式幻灯滑动效果个人作品集/博客网站模板
- org.apache.commons.beanutils.BeanUtils的常见用法
- 1.1 、Django 后台
- HDU 3746 Cyclic Nacklace (用kmp求循环节)
- 动量Momentum梯度下降算法