Fibsieve`s Fantabulous Birthday(水,但是有点坑)
开始一看数据就知道打表什么的都绝对不行了,但是没有去仔细看时间限制,就打算:
如果s不是完全平方数,则找到它对应的比它大的最小的完全平方数
如果是完全平方数那就简单了:直接通过判断奇偶来确定它是x= =1 还是 y= =1
由于可能它会转弯,例如:s==19时,如果只是找到25然后x–,这肯定是行不通的,也就是要转弯
开始想到的是用个小循环(就死上了没仔细看题目的当)时间限制为0.5s,肯定这样会TLE
还踩了一个小坑,这个是低级错误,前面的Case都没加,我也是佛了自己
最终修改终于A了,这个水题搞的心态有点崩。。。。。。。。。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int main(){
int t;
ll s;
ll x,y;
scanf("%d",&t);
for(int k=1;k<=t;k++){
scanf("%lld",&s);
ll num=sqrt(s);
//cout<<num<<endl;
if(num*num==s){
if(num%2==1){
printf("Case %d: 1 %lld\n",k,num);
}
else
{
printf("Case %d: %lld 1\n",k,num);
}
continue;
}
//cout<<num<<endl;
ll cnt=num+1;
if(cnt%2==1){
x=1;
y=cnt;
ll n=cnt*cnt-s;
if(n<cnt){
x=n+1;
}
else{
x=cnt;
y=cnt-(n-cnt)-1;
}
}
else{
y=1;
x=cnt;
ll n=cnt*cnt-s;
if(n<cnt){
y=n+1;
}
else{
y=cnt;
x=cnt-(n-cnt)-1;
}
}
printf("Case %d: %lld %lld\n",k,x,y);
}
return 0;
}
这个0秒就看的很舒服