社区讨论
邪门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
求大佬解析原理
代码
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 条回复,欢迎继续交流。
正在加载回复...