【Codeforces Round #524(Div. 2)】Olya and magical square(思维+数学推导)

题目链接

D. Olya and magical square

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Recently, Olya received a magical square with the size of 2n×2n2n×2n.

It seems to her sister that one square is boring. Therefore, she asked Olya to perform exactly kk splitting operations.

A Splitting operation is an operation during which Olya takes a square with side aa and cuts it into 4 equal squares with side a2a2. If the side of the square is equal to 11, then it is impossible to apply a splitting operation to it (see examples for better understanding).

Olya is happy to fulfill her sister's request, but she also wants the condition of Olya's happiness to be satisfied after all operations.

The condition of Olya's happiness will be satisfied if the following statement is fulfilled:

Let the length of the side of the lower left square be equal to aa, then the length of the side of the right upper square should also be equal to aa. There should also be a path between them that consists only of squares with the side of length aa. All consecutive squares on a path should have a common side.

Obviously, as long as we have one square, these conditions are met. So Olya is ready to fulfill her sister's request only under the condition that she is satisfied too. Tell her: is it possible to perform exactly kk splitting operations in a certain order so that the condition of Olya's happiness is satisfied? If it is possible, tell also the size of the side of squares of which the path from the lower left square to the upper right one will consist.

Input

The first line contains one integer tt (1≤t≤1031≤t≤103) — the number of tests.

Each of the following tt lines contains two integers nini and kiki (1≤ni≤109,1≤ki≤10181≤ni≤109,1≤ki≤1018) — the description of the ii-th test, which means that initially Olya's square has size of 2ni×2ni2ni×2ni and Olya's sister asks her to do exactly kiki splitting operations.

Output

Print tt lines, where in the ii-th line you should output "YES" if it is possible to perform kiki splitting operations in the ii-th test in such a way that the condition of Olya's happiness is satisfied or print "NO" otherwise. If you printed "YES", then also print the log2log2 of the length of the side of the squares through space, along which you can build a path from the lower left square to the upper right one.

You can output each letter in any case (lower or upper).

If there are multiple answers, print any.

Example

input

Copy

3
1 1
2 2
2 12

output

Copy

YES 0
YES 1
NO

Note

In each of the illustrations, the pictures are shown in order in which Olya applied the operations. The recently-created squares are highlighted with red.

In the first test, Olya can apply splitting operations in the following order:

Olya applies one operation on the only existing square.

The condition of Olya's happiness will be met, since there is a path of squares of the same size from the lower left square to the upper right one:

The length of the sides of the squares on the path is 11. log2(1)=0log2(1)=0.

In the second test, Olya can apply splitting operations in the following order:

Olya applies the first operation on the only existing square. She applies the second one on the right bottom square.

The condition of Olya's happiness will be met, since there is a path of squares of the same size from the lower left square to the upper right one:

The length of the sides of the squares on the path is 22. log2(2)=1log2(2)=1.

In the third test, it takes 55 operations for Olya to make the square look like this:

Since it requires her to perform 77 splitting operations, and it is impossible to perform them on squares with side equal to 11, then Olya cannot do anything more and the answer is "NO".

【题意】

给你一个大小为2^n*2^n的正方形,每次可以把一个正方形切割成 4个相同的正方形(田字形切割)。求是否可以切割恰好 k次,使得最终的图形可以从左下角经过若干相同边长的正方形走到右上角(只能往上和往右走)。

【解题思路】

手动计算一下可以知道如果想要从左下角走到右上角,肯定是沿着边缘走的,那么切割次数的最少次数就等于将边缘的正方形都切割到边长为1其余不变;切割的最大次数为除去边缘的正方形都切割到1。只需要遍历左下角正方形的边长,看是否有符合的切割次数正好在最少次数和最多次数之间即可。

计算过程可以参考https://hydingsy.github.io/articles/problem-Codeforces-1080D-Olya-and-Magical-Square/

这个博主讲的很清楚!

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL f[35];
int check(LL n,LL k)
{
    for(int i=0;i<n;i++)
    {
        int j=n-i;
        LL l=0,r;
        for(int k=1;k<=j;k++)
            l+=(1<<k)-1;
        //printf("l=%lld\n",l);
        if(l>k)continue;
        r=f[n]-((1<<(j+1))-1)*f[i];
        //printf("r=%lld\n",r);
        if(r<k)continue;
        return i;
    }
    return -1;
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int i=1;i<=32;i++)f[i]=4*f[i-1]+1;
    while(T--)
    {
        LL n,k;
        scanf("%lld%lld",&n,&k);
        if(n>31)printf("YES %lld\n",n-1);
        //else if(n==2 && k==3)printf("NO\n");
        else
        {
            int ans=check(n,k);
            if(ans==-1)printf("NO\n");
            else printf("YES %d\n",ans);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39826163/article/details/84833095