LightOJ-1008-Fibsieve`s Fantabulous誕生日(プッシュ式)

リンク:

https://vjudge.net/problem/LightOJ-1008

質問の意味:

Fibsieveは今年fantabulous(はい、それは実際の単語です)誕生日パーティーを持っていました。彼は実際に来年のパーティを持っていないと考えていたことを非常に多くの贈り物を持っていました。

これらの贈り物の中で、そのセルの各々に光を持っていたN X Nガラスチェス盤がありました。ボードは別個の細胞になった場合には毎秒を点灯して、暗いを行くだろう。

細胞は、図に示す順序で点灯になります。各セルは、それが点灯しますれる第二にマークされています。

(グリッド内の数字は、対応するセルが点灯時間放置)

第一、第二のセル(1,1)の光がオンになるであろう。そして、5秒のセル(3,1)がオンになります。さて、Fibsieveは(秒単位で指定)特定の時間に点灯したセルを予測しようとしています。Nが十分な大きさであることを前提としています。

アイデア:

各垂直期間の最大値検討(を\ 2 ^ N)\最初の直接計算間隔に属し、その後チェックアウト、列の数です。

コード:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<vector>

using namespace std;
typedef long long LL;
const int INF = 1e9;

const int MAXN = 1e6+10;
const int MOD = 1e9+7;

int main()
{
    int t, cnt = 0;
    scanf("%d", &t);
    while(t--)
    {
        LL s;
        scanf("%lld", &s);
        LL sq = sqrt(s);
        if (sq*sq < s)
            sq++;
        LL sum = sq*sq;
        LL x, y;
        if (sq%2 == 1)
        {
            if (sum-s >= sq)
            {
                x = sq;
                y = s-(sq-1)*(sq-1);
            }
            else
            {
                x = sum-s+1;
                y = sq;
            }
        }
        else
        {
            if (sum-s >= sq)
            {
                x = s-(sq-1)*(sq-1);
                y = sq;
            }
            else
            {
                x = sq;
                y = sum-s+1;
            }
        }
        printf("Case %d: %lld %lld\n", ++cnt, x, y);
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/11817269.html