题目

最大划分乘积

题解

这道题用到一点导数和数论的知识,很容易看出这道题是求函数

\[f(x)=(\frac{n}{x})^{x}
\]

( \(x\) 为正整数)的最大值。我们可以对 \(ln(f(x))\) 进行求导,求出 \(ln(f(x))\) 的最大值。

\[ln(f(x))=x(lnn-lnx)
\]
\[(ln(f(x)))'=lnn-lnx-1
\]

\(ln(f(x))\) 的最大值必然在 \(\lfloor \frac{n}{x} \rfloor\) 和 \(\lceil \frac{n}{x} \rceil\) 中取得。所以只需将这两个值代入取较大值即可。

对于两数相除是否为有限小数,只需将 \(x\) 除以 \(\gcd(n,x)\) 之后,再判断其能否表示为 \(2^{p_{1}}\times 5^{p_{2}}\ (p_{1}\in N,p_{2}\in N)\) ,能表示则代表其为有限小数。

代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double e = exp(1.000); int gcd(int a, int b)
{
return (b == 0) ? a : gcd(b, a % b);
} double cc(int n, int x)
{
return (double)x * log((double)n / x);
} int calc(int n)
{
int x1 = n / e, x2 = n / e + 1;
int x = cc(n, x1) > cc(n, x2) ? x1 : x2;
int p = gcd(n, x);
x /= p;
while (x % 2 == 0)
x /= 2;
while (x % 5 == 0)
x /= 5;
return (x == 1) ? -n : n;
} int main()
{
int a;
cin >> a;
int res = 0;
for (int i = 5; i <= a; i++)
res += calc(i);
cout << res;
return 0;
}

最新文章

  1. DIB位图(Bitmap)的读取和保存
  2. C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
  3. text/html与text/plain有什么区别?
  4. PHP 解压zip文件的函数封装
  5. nginx +lua +redis 构建自动缓存系统
  6. javascript的排序算法
  7. 动态插入图片到 svg 中
  8. linux查看文件大小df-du
  9. Ruby和Rails开发环境安装
  10. Java 获取 文件md5校验码
  11. opensuse 使用xx-net
  12. 制作OTA升级包
  13. mybatis:递归查询,关联查询传入多个参数
  14. Go 语言实践(一)
  15. DOM表单(复选框)
  16. swiftlint 你所要知道的所有!!
  17. switch...case... 语句中的类型转换
  18. #if 和 #ifdef 条件编译注意
  19. Android Studio注释摸版配置
  20. C# 使用Newtonsoft.Json序列化自定义类型

热门文章

  1. maven 标签 关于&lt;import&gt;标签
  2. 【LeetCode】297. 二叉树的序列化与反序列化
  3. FastAPI:一个测试人员视角的教程
  4. 小白自学vue的第一天,加油!
  5. 跟我一起写 Makefile(八)
  6. Nginx中location匹配及rewrite重写
  7. SQL注入:基本查询原理
  8. pikachu CSRF
  9. PHP变量覆盖漏洞整理
  10. idea的properties文件乱码问题解决