您的位置:首页 > 其它

HDU 5752

2016-07-26 23:53 288 查看

Sqrt Bo

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 423 Accepted Submission(s): 188


[align=left]Problem Description[/align]
Let's define the function $f(n)=\lfloor \sqrt{n}\rfloor$.

Bo wanted to know the minimum number $y$ which satisfies $f^y(n)=1$.

note:$f^1(n)=f(n),f^y(n)=f(f^{y-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.

[align=left]Input[/align]
This problem has multi test cases(no more than $120$).

Each test case contains a non-negative integer $n(n<10^{100})$.

[align=left]Output[/align]
For each test case print a integer - the answer $y$ or a string "TAT" - Bo can't solve this problem.

[align=left]Sample Input[/align]

233

233333333333333333333333333333333333333333333333333333333

[align=left]Sample Output[/align]

3

TAT

[align=left]Source[/align]
2016 Multi-University Training Contest 3

[align=left]Recommend[/align]
wange2014
题意:给你一个数 问你需要不断开根多少次结果等于1 超过5次输出 TAT

题解:由于有5次的这个限制,所以尝试寻找分界点。
很容易发现是2^{32},所以我们先比较输入的数字是否比这个大,然后再暴力开根

/******************************
code by drizzle
blog: www.cnblogs.com/hsd-/
^ ^    ^ ^
O      O
******************************/
//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#define ll long long
#define mod 1000000007
#define PI acos(-1.0)
using namespace std;
char a[205];
ll ans;
int main()
{
while(scanf("%s",a)!=EOF){
ans=0;
int len=strlen(a);
if(len>10||(len==1&&a[0]=='0'))
printf("TAT\n");
else
{
for(int i=0;i<len;i++)
ans=ans*10+a[i]-'0';
int jishu=0;
while(1)
{
jishu++;
double exm=ans;
exm=sqrt(exm);
ans=(ll)exm;
if(ans==1)
break;
}
if(jishu<=5)
printf("%d\n",jishu);
else
printf("TAT\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: