@[Anougme](/user/228087) $n=64$的时候`find(n,k)`里面ans会爆掉。
把循环上界开到$n-1$,最后return写`ans-1+ans` (ans-1+ans不超过$2^{64}-1$刚好不会爆)
我考场上就是这样变成95分(不过用的是位运算,但本质一样的)
by 万弘 @ 2020-11-01 22:07:05
@[万弘](/user/73142)
我改成这样了,还是WA最后一个
```cpp
#include<bits/stdc++.h>
using namespace std;
int n;
unsigned long long k;
unsigned long long find(int n,unsigned long long k){
unsigned long long ans=1;
for(int i=1;i<=n-1;i++){
ans=ans*2;
}
if(ans-1+ans-k<k)
return ans-1+ans;
else
return -1;
}
string dg(int n,unsigned long long k){
string a;
//cout<<n<<' '<<k<<endl;
//system("Pause");
if(n==1){
if(k==0)
a='0';
else
a='1';
}
else if(find(n,k)!=-1){
a='1'+dg(n-1,find(n,k)-k);
}
else{
a='0'+dg(n-1,k);
}
return a;
}
int main(){
cin>>n>>k;
cout<<dg(n,k);
return 0;
}
```
by woshixingyu @ 2020-11-02 09:41:22
@[Anougme](/user/228087) `k*2`是会爆的。同时ull类型返回-1不太行把,而且和-1比较也不太行。不过可以利用`ans-1+ans>0`的性质改成这样:
```cpp
unsigned long long find(int n,unsigned long long k)
{
unsigned long long ans=1;
for(int i=1;i<n;++i)ans=ans*2;
if(k>=ans)return ans-1ull+ans;
else return 0;
}
string dg(int n,unsigned long long k){
string a;
//cout<<n<<' '<<k<<endl;
//system("Pause");
if(n==1){
if(k==0)
a='0';
else
a='1';
}
else if(find(n,k)!=0){
a='1'+dg(n-1,find(n,k)-k);
}
else{
a='0'+dg(n-1,k);
}
return a;
}
```
就可以过了
by 万弘 @ 2020-11-02 09:44:11
@[万弘](/user/73142) 谢谢,改成那样过了。之前自己也改了几次,现在重新提交发现都是因为ull返回-1导致最后一个点出错,改成0可以了
by woshixingyu @ 2020-11-02 09:51:19
@[Anougme](/user/228087) 不客气(毕竟我考场上也就95
分
by 万弘 @ 2020-11-02 10:23:39
@[万弘](/user/73142) 我今年高二才考,做了往年的真题,感觉最近几年的难度上来了....实力跟不上
by woshixingyu @ 2020-11-02 10:43:35
@[万弘](/user/73142) 请问string是用单引号的吗?那双引号可以吗?我用双引号好像也没问题。
by JimmyFlower @ 2020-11-02 18:14:17
@[JimmyFlower](/user/124676) 我可能没有听懂你的问题。。。不过我知道`std::string`重载了`+`号,比如这样:
```cpp
std::string s="ab";
s+='c';//在s后面加入字符c
s+="de";//在s后面加入字符串de
```
by 万弘 @ 2020-11-02 19:54:03
@[万弘](/user/73142)
```cpp
string s;
就是这两个有什么区别:
s='a';
s="a";
```
by JimmyFlower @ 2020-11-02 20:02:22
您的意思是加双引号是字符串,单引号就是字符吗?
by JimmyFlower @ 2020-11-02 20:03:10