【坑】高数满分—pow的问题

Description

众所周知,qm的高数总是满分。这一天数学白痴锦鱼拿着一道数学题来问qm,qm不屑做这种简单的题,于是把这道题丢给你来完成。题目是这样的:给定a、b、c三个整数,求最大的整数x,满足xa+b*x<=c,其中xa表示x的a次方,b*x表示b乘以x。

Input

第一行输入三个整数a(1<=a<=10),b(0<=b<=1018),c(0<=c<=1018),分别对应题目中a、b、c三个整数。

Output

输出一个整数,表示所求的最大的x。

Sample Input

2 3 4

Sample Output

1
这题虽然是一道二分,但由于x^a可能过于大,所以x每次要去pow(c,1.0/a)避免爆炸。
xyjj说pow在计算longlong的时候会出现各种奇怪的问题(导致我WA了无数次),后来网上查了一下说是因为pow是计算的double所以会有精度丢失的问题,所以二分里面的pow要自己写……………….
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a,b,c;
ll qkpow(ll x,int p)
{
	if(p==0) return 1;
	if(p==1) return x; 
	
	ll y=qkpow(x,p>>1);
	
	y=y*y;
	
	if(p&1) 
	y=y*x;
	
	return y;
}
int main()
{
	cin>>a>>b>>c;
	ll l=0,r=(ll)pow((double)c,1.0/a);
	//if(b!=0) r=c/b;
	//r=min(r,(ll)pow(c,1.0/a));
	while(r-l>1)
	{
		ll mid=(r+l)>>1;
		if(qkpow(mid,a)+b*mid<=c)
		{
			l=mid;	
		}
		else
		{
			r=mid;
		}
	}	
	if(qkpow(r,a)+r*b<=c) cout<<r;
	else cout<<l;
} 

关于精度问题:

12

发表评论

电子邮件地址不会被公开。 必填项已用*标注