HDU-6182

 

       打了一下数据范围,发现大概在15的时候不会爆1e18,那么就先预处理出所有的k的k次方,然后每读入一个n遍历一边查询当前的n对应的小于等于的最大的k是几。

代码如下

#include <bits/stdc++.h>
#define sc1(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define sc4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d)
using namespace std;
typedef long long LL;
int gcd(int a,int b){if (b == 0) return a; return gcd(b , a%b);}
int lcm(int a, int b){ return a/gcd(a,b)*b;}
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48); ch=getchar();}
    return x*f;
}
LL fac[100];
int main(){
    LL n;
    for (int i=1; i<=15; i++) {
        LL now = 1;
        for (int j=1; j<=i; j++) {
            now *= i;
        }
        fac[i] = now;
    }
    while (scanf("%lld",&n) == 1) {
        if (n >= fac[15]){ cout << 15 << endl; continue; }
        for (int i=1; i<=15; i++) {
            if (fac[i] > n){
                cout << i - 1 << endl;
                break;
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CCCCTong/article/details/81590769
hdu