洛谷P6685 可持久化动态仙人掌的直径问题

看标题逼格这么高结果只是虚晃一枪
题目描述:

给定 n , m n,m n,m,求有多少个正整数 x x x,使得 x m ≤ n x^m\le n xmn

tips

乍一眼看二分,但容易爆,因为 n , m ≤ 1 0 9 n, m \le 10 ^9 n,m109 , 枚举太大会超 long long。

第二眼看就是一个简单的数学柿子 − − > --> >

x m ≤ n x ^ m \le n xmn ,得 − − > --> >
l o g x n ≤ m log_{x}{n} \le m logxnm

左边可由那啥换底大法变形得到 − − > --> >
l o g e n l o g e x ≤ m \frac{log_{e}{n} }{ log_{e}{x}} \le m logexlogenm
移项得到 − − > --> >
l o g e x ≥ l o g e n m log_{e}{x} \ge \frac{log_{e}{n}}{m} logexmlogen
− − > --> >
x ≤ e l o g e n m x \le e^{\frac{log_{e}{n}}{m}} xemlogen
用自带函数 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;
}

完结撒花 ✿✿ヽ(°▽°)ノ✿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值