
#include<cstdio> #include<cmath> using namespace std; int main() { long long begin,end,mid,k; long long n,m; begin = 1;end = 100000000; scanf("%d%d",&n,&m);//要使得什么的n次方为m while(begin <= end){ mid = (begin + end) >> 1; k = pow(mid , n); if(k < m) begin = mid; else if(k > m) end = mid; else { printf("%lld",mid); break; } } return 0; }
不断改变begin,end的值不断靠近要求的东西。
如果为数的话没事,如果二分下标那么r-1,l+1。
如LIS,详情见传送门