看标题逼格这么高结果只是虚晃一枪
题目描述:
给定 n , m n,m n,m,求有多少个正整数 x x x,使得 x m ≤ n x^m\le n xm≤n 。
tips
乍一眼看二分,但容易爆,因为 n , m ≤ 1 0 9 n, m \le 10 ^9 n,m≤109 , 枚举太大会超 long long。
第二眼看就是一个简单的数学柿子 − − > --> −−>
由
x
m
≤
n
x ^ m \le n
xm≤n ,得
−
−
>
-->
−−>
l
o
g
x
n
≤
m
log_{x}{n} \le m
logxn≤m,
左边可由那啥换底大法变形得到
−
−
>
-->
−−>
l
o
g
e
n
l
o
g
e
x
≤
m
\frac{log_{e}{n} }{ log_{e}{x}} \le m
logexlogen≤m,
移项得到
−
−
>
-->
−−>
l
o
g
e
x
≥
l
o
g
e
n
m
log_{e}{x} \ge \frac{log_{e}{n}}{m}
logex≥mlogen ,
即
−
−
>
-->
−−>
x
≤
e
l
o
g
e
n
m
x \le e^{\frac{log_{e}{n}}{m}}
x≤emlogen,
用自带函数
e
x
p
(
)
exp()
exp() 就可以直接计算以自然对数
e
e
e 为底的幂, 而自带函数
l
o
g
(
)
log()
log() 也是计算以
e
e
e 为底的对数。复杂度仅为计算一个
l
o
g
log
log ,一个
e
x
p
exp
exp 和一次除法的大小。
可能是精度问题,如果不特判 m = 1 m = 1 m=1 の 情况会 WA #1,这里需要注意一下。
T i m e Time Time f o r for for c o d e code code − − > --> −−>
#include <cstdio>
#include <cmath>
#include <cctype>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
inline int read(){
ll x=0,w=0;char ch=getchar();
while (!isdigit(ch))w|=ch=='-',ch=getchar();
while (isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return w?-x:x;
}
int n, m, ans;
int main(){
n = read(), m = read();
if(m == 1){
printf("%d",n);
return 0;
}
else {
printf("%d",(int)(exp(log(n) / m)));
return 0;
}
return 0;
}
完结撒花 ✿✿ヽ(°▽°)ノ✿