A Math Problem
Time limit | 1000 ms |
---|---|
Memory limit | 32768 kB |
OS | Windows |
You are given a positive integer n, please count how many positive integers k satisfy k^k ≤ n.
- Input
There are no more than 50 test cases.
Each case only contains a positivse integer n in a line.
1 ≤ n ≤ 10^18
- Output
For each test case, output an integer indicates the number of positive integers
k satisfy k^k ≤ n in a line.
- Sample Input
1
4
- Sample Output
1
2
你得到一个正整数n,请输出有几个正整数k满足 k^k ≤ n
- 输入
测试用例不超过50个
每种情况只包含一行中的正整数n
1 ≤ ñ ≤ 10^18
- 输出
对于每个测试用例,输出一个整数表示正整数k满足k^k ≤ n的k的数量
- 样例输入
1
4
- 样例输出
1
2
这个题目挺容易看懂,就是因为数字大所以容易超时
【1】因为k^k和n无关,所以很容易想到打个表就可以了
【2】显然如果要减小计算量,我们可以想到 ln( k ^ k ) = k * ln( k ),直接计算
10^18 里最大的 k^k就是 15^15
Time | 0ms |
---|---|
Memory | 1204kB |
Length | 481 |
Lang | GCC |
#include <stdio.h>
long long sum[20];
long long Quickpow(int a, int i) {
long long ans = 1, base = a;
while (i != 0) {
if (i & 1 != 0) ans *= base;
base *= base;
i = i >> 1;
}
return ans;
}/*一个快速幂*/
int main(int argc, char const *argv[]) {
int i;
long long n;
for (i = 1; i < 16; i++) {
sum[i] = Quickpow(i, i);
}/*在最开始建个表*/
while (~scanf("%lld", &n)) {
for (i = 1; i < 16; i++) {
if(sum[i] > n) break;
}
printf("%d\n", i - 1);
}
return 0;
}
#include<stdio.h>
#include<math.h>
int main(){
long long n, ans;
int i;
while(~scanf("%lld", &n)) {
ans = 1;
i = 0;
while(ans * log(ans) <= log(n)){
ans++;
i++;
}
printf("%d\n", i);
}
return 0;
}