题解 P1925
Great_Influence · · 题解
高中数学题。
首先,对于固定的数字
对两边同时取对数,得
求导,得
所以
可以知道,当
而
所以
而
所以当
然而需要注意,
分别计算这两个点对应的函数值取max即可。
不好算?可以对原函数取对数,再比较对数即可。
然后便得到了
这个更简单。容易知道
所以直接强行把
注意提前除去
代码:
#include<bits/stdc++.h>
#include<cctype>
#define For(i,a,b) for(i=(a),i##end=(b);i<=i##end;++i)
#define Forward(i,a,b) for(i=(a),i##end=(b);i>=i##end;--i)
#define Rep(i,a,b) for(register int i=(a),i##end=(b);i<=i##end;++i)
#define Repe(i,a,b) for(register int i=(a),i##end=(b);i>=(b);--i)
using namespace std;
template<typename T>inline void read(T &x){
T s=0,f=1;char k=getchar();
while(!isdigit(k)&&k^'-')k=getchar();
if(!isdigit(k)){f=-1;k=getchar();}
while(isdigit(k)){s=s*10+(k^48);k=getchar();}
x=s*f;
}
void file(void){
#ifndef ONLINE_JUDGE
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
#endif
}
const int MAXN=110001;
static int n;
const long double e=2.71828182845904523536;
inline void init()
{
read(n);
}
inline long double calc(int f,int x)
{
return x*log((long double)f/x);
}
inline void solve()
{
static int ans1;
static int ans=0;
Rep(i,5,n)
{
ans1=floor(i/e);
if(calc(i,ans1)<calc(i,ans1+1))++ans1;
ans1/=__gcd(ans1,i);
while(ans1%2==0)ans1/=2;
while(ans1%5==0)ans1/=5;
if(ans1!=1)ans+=i;
else ans-=i;
}
printf("%d\n",ans);
}
int main(void){
file();
init();
solve();
return 0;
}