开了unsigned long long的95分递归

P5657 [CSP-S2019] 格雷码

@[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


| 下一页