生日宴会Light1008(二分)

第一次把自己所出现的错误全部改正并且全A(确是慢慢失落感)确实有太多的不应该;

这一题刚开始感觉挺难的但是仔细想一想,并不是很难,刚开始用二分,后来发现二分也用不到就可以过

关于自己的一点小错误(其实当显示WA时一定要做两件事1.把能想到的特殊情况试一下2.把代码仔细看一遍确保每种情况是对的

1.两种情况第二种情况忘记除2

2.第一个细节忽略了coun++;

H - 生日宴会
Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Description

某只同学在生日宴上得到了一个N×N玻璃棋盘,每个单元格都有灯。每一秒钟棋盘会有一个单元格被点亮然后熄灭。棋盘中的单元格将以图中所示的顺序点亮。每个单元格上标记的是它在第几秒被点亮。

第一秒棋格(1,1)将被点亮,第五秒棋格(3,1)将被点亮。

现在这只同学想知道在给定的时间哪个棋格将被点亮(时间将以秒为单位给出)。题目假设N足够大。

Input

先输入一个整数T(<= 200) , 表示测试用例的组数。

每一组用例将包括一个整数S(1 ≤ S ≤ 1015),表示时间。

(注:此题中长整形的输入输出要用 %lld 格式实现)

Output

对于每组用例您必须打印用例编号和两个数字(x,y)表示列号和行号。

Sample Input

3

8

20

25

Sample Output

Case 1: 2 3

Case 2: 5 4

Case 3: 1 5



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <cstdio>
#include <cmath>
#define MAX 100000010

using namespace std;

long long erfen(long long l,long long r,long long n)
{
    long long mid;
    while(l<=r)
    {
        mid=(r+l)/2;
        if(mid*mid==n)
            return mid;
        if(mid*mid<n&&pow(mid+1,2)>n)
            return mid+1;
        else if(mid*mid>n)
            r=mid-1;
        else
            l=mid+1;
    }
    if(1*1==n)
        return 1;
    else
        return -1;
}

int main()
{
    long long n,mid;
    int coun=1,sum;
    long long j,i;
    scanf("%d",&sum);
    while(sum--)
    {
    scanf("%lld",&n);
    j=erfen(1,MAX,n);
    if(j%2!=0)
    {
        mid=(j*j+(j-1)*(j-1)+1)/2;
        if(n>=mid)
        {
            i=j*j-n+1;
            printf("Case %d: %lld %lld\n",coun++,i,j);
        }
        else
        {
            i=n-(j-1)*(j-1);
            printf("Case %d: %lld %lld\n",coun++,j,i);
        }
    }
    else
    {
        mid=(j*j+(j-1)*(j-1)+1)/2;
        if(n>=mid)
        {
            i=j*j-n+1;
            printf("Case %d: %lld %lld\n",coun++,j,i);
        }
        else
        {
            i=n-(j-1)*(j-1);
            printf("Case %d: %lld %lld\n",coun++,i,j);
        }
    }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值