nyoj 633 幂

49 阅读1分钟

幂 nyoj 633 应用数学

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

 

  • 描述

    在学习循环的时候,我们都练习过利用循环计算a的k次方。现在给定整数k和一个整数m,请你求出对应的整数a,使得a的k次方是不超过m并且最接近m的数值。 

 

  • 输入

    一个整数T表示测试组数。
    对于每组测试数据:
    给定两个整数k和m 

    数据范围:
    1 <= T <= 20
    1 <= k <= 10^9
    0 <= a <= 10^9
    0 <= M <= 10^100

  • 输出

    对于每组数据,输出一个整数a占一行。

  • 样例输入

    2
    2 4
    3 27 
    
  • 样例输出

    2
    3 
    
    分析:
    a^k == m
    ==> log10(a^k) = k*log10(a) = log10(m)
    ==> log10(a) = log10(m)/k
    ==> a = 10^[log10(m)/k]
    但是应为中间结果可能会有小数产生 而a又要是一个整数 所以a^m可能不一定是最接近m的 (小数有误差导致的)
    但可以从a开始递增开始判断 (a+1)^k < m  如果成立  则a++  就这样一直判断下去
    
    附上代码:
    
    /*
    author:谦智
    幂 nyoj 633 应用数学 
    */
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int main() {
      int t;
      cin >> t;
      while (t--) {
        double k, m;
        cin >> k >> m;
        int a = pow(10,(log10(m))/k);
        while (pow(a+1,k) - m < 1e-6) {
          a++;
        }
        cout << a << endl;
      }
    }