打了一下数据范围,发现大概在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; }