社区讨论

邪门bug求调

P5657[CSP-S 2019] 格雷码参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhj00eev
此快照首次捕获于
2025/11/03 18:29
4 个月前
此快照最后确认于
2025/11/03 18:29
4 个月前
查看原帖
d=64的时候pow2x_1函数会返回0,但是直接填参数64就会返回正确结果18446744073709551615(即unsigned long long存储上限)
所以这个程序会卡95pts,WA #20
难道d等于64但又不等于64
求大佬解析原理
代码
CPP
#include <iostream>
#include <string>
using namespace std;
const unsigned long long ULLMAX=-1;
typedef unsigned long long ull;
inline ull pow2x_1(ull n)//计算2^x-1的值
{
	return ((ULLMAX<<n)^(ULLMAX));
}
string ans(ull d,ull n)
{
	//cout<<d<<' '<<n<<endl;
	
    if(d==1)
    {
    	if(n<=0)return "0";
    	else return "1";
	}
    if(n<=pow2x_1(d-1))
    {
        return "0"+ans(d-1,n);
    }
    else
    {
//这一段是调试代码,输入64 18446744073709551615的运行结果:
//64 18446744073709551615(直接填64结果正确)
//64 0(填d=64就会出错)
//1(说明d=64)
//0 18446744073709551615
//1(因为溢出了)
    	cout<<64<<' '<<pow2x_1(64)<<endl;
    	cout<<d<<' '<<pow2x_1(d)<<endl;
    	cout<<(d==64)<<endl;
    	cout<<pow2x_1(d)<<' '<<n<<endl;
    	cout<<pow2x_1(d)-n<<endl;
//调试结束
        return "1"+ans(d-1,pow2x_1(d)-n);
    }
}
int main()
{
	//cout<<pow2x_1(64)<<endl;
	//cout<<pow2x_1(64)-18446744073709551615ull<<endl;
    ull n,k;
    cin>>n>>k;
    cout<<ans(n,k)<<endl;

}

回复

4 条回复,欢迎继续交流。

正在加载回复...