【洛谷P1925】最大划分乘积

题目链接:洛谷P1925

解法:数学

先考虑何时 P P P最大。
对于 N N N,设划分为 x x x个数,令 f ( x ) = P = ( N x ) x f(x)=P=(\frac{N}{x})^x f(x)=P=(xN)x
两边取对数得 ln ⁡ f ( x ) = ln ⁡ ( N x ) x = x ln ⁡ ( N x ) \ln f(x)=\ln (\frac{N}{x})^x=x\ln (\frac{N}{x}) lnf(x)=ln(xN)x=xln(xN)
两边求导得 f ′ ( x ) f ( x ) = ln ⁡ ( N x ) − 1 = ln ⁡ ( N e x ) \frac{f'(x)}{f(x)}=\ln (\frac{N}{x})-1=\ln (\frac{N}{ex}) f(x)f(x)=ln(xN)1=ln(exN)
f ′ ( x ) = f ( x ) ln ⁡ ( N e x ) f'(x)=f(x)\ln (\frac{N}{ex}) f(x)=f(x)ln(exN)
f ( x ) f(x) f(x)恒大于 0 0 0 ln ⁡ ( N e x ) ∈ ( − ∞ , + ∞ ) \ln(\frac{N}{ex})\in(-\infty,+\infty) ln(exN)(,+),故 f ′ ( x ) f'(x) f(x)先为正后为负,从而 f ( x ) f(x) f(x)先增后减,于是其至少有一极大值点。
f ( x ) f(x) f(x)的极大值点为 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0)),则 f ′ ( x 0 ) = 0 f'(x_0)=0 f(x0)=0,即 f ( x 0 ) ln ⁡ ( N e x 0 ) = 0 f(x_0)\ln (\frac{N}{ex_0})=0 f(x0)ln(ex0N)=0
ln ⁡ ( N e x 0 ) = 0 \ln (\frac{N}{ex_0})=0 ln(ex0N)=0
x 0 = N e x_0=\frac{N}{e} x0=eN
故极大值点为 ( N e , f ( N e ) ) (\frac{N}{e},f(\frac{N}{e})) (eN,f(eN))
又该极大值点唯一,故该极大值点为 f ( x ) f(x) f(x)的最大值点。
但题目要求 k k k为整数( k k k就是 x x x),所以 P P P最大时 x = ⌊ N e ⌋ x=\lfloor \frac{N}{e}\rfloor x=eN x = ⌈ N e ⌉ x=\lceil \frac{N}{e}\rceil x=eN
直接求 f ( x ) f(x) f(x)不好求,两边取对数后比较即可。
得到令 P P P最大的 x x x之后,验证 P P P是否为有限小数。
P = a b ( gcd ⁡ ( a , b ) = 1 ) P=\frac{a}{b}(\gcd(a,b)=1) P=ba(gcd(a,b)=1),则 P P P为有限小数的充要条件为 ∀ x ∈ N − { 0 , 1 , 2 , 5 } , b m o d    x ̸ = 0 \forall x\in\mathbb N-\{0,1,2,5\},b \mod x\not= 0 xN{0,1,2,5},bmodx̸=0
除掉 b b b的所有 2 2 2 5 5 5因子然后验证即可。

代码
#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std;

double e=2.718281828459045;
int n,ans;

int gcd(int a,int b){return b==0?a:gcd(b,a%b);}

int check(int x){
	double x2=floor((double)x/e),x3=ceil((double)x/e);int maxn;
	if(x2*log((double)x/x2)<x3*log((double)x/x3))maxn=(int)x3;else maxn=(int)x2;
	maxn/=gcd(x,maxn);
	while(maxn%2==0)maxn>>=1;while(maxn%5==0)maxn/=5;
	return maxn>1?1:-1;
}

int main(){
	scanf("%d",&n);
	for(int i=5;i<=n;++i)ans+=check(i)*i;
	printf("%d",ans);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值