根据题目中一开始扔出的脑筋急转弯,其实可以发现1 2 4 8 ....这种数字是一个等比数列。很自然地想到转换成一个等比数列的求和问题。

	for (i = 1;sum<m;i = i * 2)
     	{
     
            sum = sum + i;
            count++;
            if (sum>=m)
             {  
             	cout << count << endl;
                break;
             }
   
          很自然就写出了以上的等比数列求和代码。但是其实发现过不去一个特殊的测试用例"7 7"这组,通过你调试

可以发现 sum=1 ,sum=3的时候能进for 当sum=7时进的if判断了,然后加1得到了错误的结果。本人想到了最快的方法就是把if里面"="的改掉了,结果发现更错了,其实。(其实到现在也没有相通)后面去看了别人的提交是发现要改for循环的判断条件是sum+i<m。我是这么想的,sum是前面的和的大集体,当纳入的新的成员i,超出了m,说明这个成员我不能接受,也就是官方题解中的特别注意的事项。(本人第一次写题解,如有不足请多多见谅)

最后附上修改的代码

#include

#include <math.h>

using namespace std;

int main() {

long long  t;

cin >> t;

long long i, len, m, count, sum;

	while (t--)
	{
    	count = 0;
    	sum = 0;
    	cin >> len >> m;
        	for (i = 1;sum+i<len;i = i * 2,count++)
        	{
            	sum = sum + i;
            	if (sum>=m)
            	{
                	count++;
                	break;
            	}
        	}
    	cout<<count<<endl;
	}
}