Sqrt Bo
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2438 Accepted Submission(s): 806
Problem Description
Let's define the function
f(n)=⌊n−√⌋
.
Bo wanted to know the minimum number y which satisfies fy(n)=1 .
note: f1(n)=f(n),fy(n)=f(fy−1(n))
It is a pity that Bo can only use 1 unit of time to calculate this function each time.
And Bo is impatient, he cannot stand waiting for longer than 5 units of time.
So Bo wants to know if he can solve this problem in 5 units of time.
Bo wanted to know the minimum number y which satisfies fy(n)=1 .
note: f1(n)=f(n),fy(n)=f(fy−1(n))
It is a pity that Bo can only use 1 unit of time to calculate this function each time.
And Bo is impatient, he cannot stand waiting for longer than 5 units of time.
So Bo wants to know if he can solve this problem in 5 units of time.
Input
This problem has multi test cases(no more than
120
).
Each test case contains a non-negative integer n(n<10100) .
Each test case contains a non-negative integer n(n<10100) .
Output
For each test case print a integer - the answer
y
or a string "TAT" - Bo can't solve this problem.
Sample Input
233 233333333333333333333333333333333333333333333333333333333
Sample Output
3 TAT
题解
由于有5次的这个限制,所以尝试寻找分界点。
很容易发现是232,所以我们先比较输入的数字是否比这个大,然后再暴力开根。
复杂度是O(loglogn)。
注意特判n=0的情况。
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char a[1005];
while(scanf("%s",a)!=EOF)
{
int len=strlen(a);
if(len>10)
{
printf("TAT\n");
}
else
{
long long ans=0;
for(int i=0;i<len;i++)
{
ans=ans*10+a[i]-'0';
}
if(ans>4294967295||ans==0)
printf("TAT\n");
else
{
int count=0;
while(ans>1)
{
ans=sqrt(ans);
count++;
}
printf("%d\n",count);
}
}
}
}