小学数学,脑补

一开始看到这题,猜了个规律想写但是我是拒绝的。

因为我无法证明。

好吧,主要还是小学数学没学好吧。

要理解这题,首先得搞懂一个重要问题。假设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 ;
}

最新文章

  1. Android学习十一:高德地图使用
  2. .NET 平台下的插件化开发内核(Rabbit Kernel)-转
  3. SpringMVC使用中遇到的问题总结
  4. Centos下使用gitosis配置管理git服务端(转载)
  5. Google Code Pretiffy 代码 着色 高亮 开源 javascript(JS)库
  6. Android串口通信(基于Tiny6410平台)
  7. delphi Sender和Tag的用法
  8. 算法导论学习-RED-BLACK TREE
  9. Sublime Text 3 乱码解决
  10. Angular - - $compile编译服务与指令
  11. [bzoj4873]寿司餐厅
  12. Image中的alt
  13. 开启Apache的server status监测
  14. Scala多重继承及AOP
  15. vue中的provide/inject的学习
  16. Bootstrap3实现的响应式幻灯滑动效果个人作品集/博客网站模板
  17. org.apache.commons.beanutils.BeanUtils的常见用法
  18. 1.1 、Django 后台
  19. HDU 3746 Cyclic Nacklace (用kmp求循环节)
  20. 动量Momentum梯度下降算法

热门文章

  1. Android之——获取手机安装的应用程序
  2. Python下opencv使用笔记(二)(简单几何图像绘制)
  3. Acer商祺x4610安装及使用
  4. grid 布局一 固定宽度+自适应宽度
  5. SQL Server 2008R2发布与订阅的配置
  6. 自定义ios NSLog
  7. 关于Azure Storage Blob Content-Disposition 使用学习
  8. 动态加载script 和 link
  9. MongoDB学习——持续更新
  10. UVA - 11584 划分字符串的回文串子串; 简单dp