题目链接:洛谷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
∀x∈N−{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);
}