paulzhou的数学?TAT?
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 4 Accepted Submission(s) : 4
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
众所周知,paulzhou的数学不太好。现在他有一个问题,希望你帮他解答:
定义,求最小的正整数y使得,其中
Input
第一行输入一个整数T(T<=10),表示测试实例的数量;
每组用例输入一个非负整数n(n<10^100)
Output
对于每组用例,如果y<=5则输出y,否则输出“TAT”
Sample Input
2
233
233333333333333333333333333333333333333333333333333333333
Sample Output
3
TAT
Author
Anonymous
怎么说呢 ,这道题,一看就是找规律的,有临界值,所以要打表找到所有的临界值。还有一点,如果直接暴力找会累死,所以建议用二分找 ;
我找到的临界值
dp[1]=0;
dp[2]=1;
dp[4]=2;
dp[16]=3;
dp[256]=4;
dp[65536]=5;
dp[4294967296]=6; //发现了把,要暴力,机器要报废
// 好吧,没有必要非 用二分(当时光想着打表了,虽然也过了,但确实费力些功夫。朋友给我指点迷津),仔细想想就会发现,对于n==4的时候y==2,那么当y==3的时候,其实就是一个值开根号之后为4就对了所以这个时候n==16 ,依次类推。
打表找规律的代码 (全当多复习下这种的二分用法 Σ( ° △ °|||)︴)
#include<string.h>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<iostream>
#define LL long long
using namespace std;
/************************************/
const int MAXN = 1e6;
const double eps = 1e-8;
const int inf =0x3f3f3f3f;
int num;
void ss(LL n)
{
if(n==1) return ;
num++;
ss(floor(sqrt(n)));// floor()是向下取整,ceil()是向上取整
}
int main()
{
LL ans;
LL l=1;LL r=1e18;
ans=-1;LL mid;
while(l<=r)
{
mid=(l+r)>>1;
num=0;
ss(mid);
if(num>=6) ans=mid,r=mid-1; // 将这个6不断更改找到临界值
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}
AC代码
不管用哪种方法找到的临界值,最后都是一样的。
#include<string.h>
#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;
/************************************/
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
char s[1000];
gets(s);
int len =strlen(s);
int answer;
if(len==1)
{
if(s[0]=='1') answer=0;
if(s[0]>='2'&&s[0]<'4') answer=1;
if(s[0]>='4') answer=2;
} else if(len==2)
{
if(strcmp(s,"16")<0) answer=2;
else answer=3;
}else if(len==3)
{
if(strcmp(s,"256")<0) answer=3;
else answer=4;
}else if(len>3&&len<5) answer=4;
else if(len==5)
{
if(strcmp(s,"65536")<0) answer=4;
else answer=5;
}else if(len>5 &&len <10 ) answer=5;
else if(len==10)
{
if(strcmp(s,"4294967296")<0) answer=5;
else answer=6;
}else answer=6;
if(answer<6) printf("%d\n",answer);
else puts("TAT");
}
return 0;
}