本文大部分思路转载自http://www.cnblogs.com/zquzjx/p/10014496.html,本人稍有改动

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
3
1 1
2 2
2 12
Output
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”。

题意:

给你一个T,表示T组样例,每组样例输入n,k。n表示给你一个边长为2^n的正方形,k表示操作次数。每次操作你都可以从中选出一块正方形,将其分为4块相等的小正方形。进行k次操作后能否使左下角的正方形的边长和右上角的正方形的边长相等并且存在一条从左下角正方形到右上角正方形的路径,并且路径上的正方形的边长也和它们相等。若可以输出 “YES 切割后的log2(边长)” 若操作次数用不完输出“NO”。

思路:

当n=1时,对2^1的正方形分解为边长为1的正方形需要1次操作

当n=2时,对2^2的正方形分解为边长为1的正方形需要4x1+1=5次操作

当n=3时,对2^3的正方形分解为边长为1的正方形需要5x4+1=21次操作

我们可以构建一个数组a[i] a[i]表示当n=i时,对2^i的正方形分解为边长为1的正方形需要a[i]次

操作,则a[i]=4*a[i-1]+1

我们观察到,当n=31时,需要的操作次数已经超过10^18,(即k最大时不足以将一个边长为

2^32的正方形切割成边长为1的小正方形)。我们假设当n=32时,不管k有多大,我们将n分

为4块边长为2的31次方的正方形,在右下角的正方形上将剩余的k全部用上(肯定能全用

上)。因此我们得到当n>31时,我们总能够用相同的方法切割正方形,因此当n>31时,ans=n-1。

当n<=31时,我们需要找到一条从左下到右上的路径,我们可以假设路径是沿着边缘的,因此

我们每次切割时只切割边缘的正方形
Codeforces Round #524 (Div. 2) D - Olya and magical square
每次只对边缘的正方形切割一次

第一次需要切割 1 格 (即切1次) (路径格子边长减为 2^(n-1) )

第二次需要切割 3 格 (即切3次) (路径格子边长减为 2^(n-2) )

第三次需要切割 7 格 (即切7次) (路径格子边长减为 2^(n-3) )

每次递推可得到下次需要切割的格子数 now(下次) = now(本次) * 2 + 1

累加得到边缘圈应切割次数 tot += now

但是仅仅切割边缘圈的正方形用到的切割次数有可能达不到k的,因此我们要将不在路径中的

正方形全部切割为边长为1的正方形(因为怎么切割都不影响路径中的正方形)来凑够k。
Codeforces Round #524 (Div. 2) D - Olya and magical square
第一次红色格子可切割 共需切割次数 a[n-1] * (3-2)

第二次深绿色格子可切割 共需切割次数 a[n-2] * (7-2)

第三次草色格子可切割 共需切割次数 a[n-3] * (15-2)


(由于恰好对应下次切割时要切割的外围圈格子往内的一圈,往内一圈会少两格,所以恰好是 now(下次)-2 格)

res+=a[n-cnt]*(now(下次)-2);

累加得到额外可切割次数 res

那么当只切外围圈的操作数 tot >= k 时 可得到答案

或者 当切外围也切内圈 tot+res>=k 时 也可得到答案

否则 k次操作 就不可能被用完

#include<cstdio>
using namespace std;
typedef long long ll;
ll a[100];
int main()
{
	ll n,k,tot,now,cnt,res,t;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld%lld",&n,&k);
		if(n>31)
		{
			printf("YES %lld\n",n-1);
			continue;
		}
		a[0]=0;
		for(int i=1;i<=31;i++)
			a[i]=a[i-1]*4+1LL;
		tot=0,now=1,cnt=0,res=0;
		while(tot+now<=k&&cnt<n)
		{
			tot+=now;
			now=now*2+1;
			cnt++;
			res+=a[n-cnt]*(now-2);
		}
		if(k>tot+res)
			printf("NO\n");
    	else
			printf("YES %lld\n",n-cnt);
	}
	return 0;
}

相关文章: