是2021年牛客的依久依久
定义
val(i)为i分解为若干个不相邻斐波那契数的异或和,输入l和r,求val(l)到val(r)的异或和
这是我的代码
#include<bits/stdc++.h>
using namespace std;
const int n=86;
int fib[10086],s[10086];
int t;
long long l,r;
long long solve(long long l,long long r){
if(l>r)return 0;
int L=lower_bound(fib+1,fib+n+1,l)-fib,R=upper_bound(fib+1,fib+n+1,r)-fib-1;
if(L>R){
long long rt=((r-l+1)&1)?fib[R]:0;
rt^=solve(l-fib[R],r-fib[R]);
return rt;
}
long long rt=s[R]^s[L]^fib[L];
rt=rt^solve(l,fib[L]-1)^solve(fib[R]+1,r);
return rt;
}
int main(){
freopen("yijiu.in","r",stdin);
freopen("yijiu.out","w",stdout);
fib[1]=1,fib[2]=2,s[1]=1,s[2]=3;
for(int i=3;i<=n;i++){
fib[i]=fib[i-1]+fib[i-2];
s[i]=s[i-1]^s[i-2]^fib[i-2]^fib[i];
if((fib[i-2]-1)&1){
s[i]^=fib[i-1];
}
}
cin>>t;
while(t--){
cin>>l>>r;
cout<<solve(l,r)<<'\n';
}
return 0;
}
但是最后四个点RE了,不知道为什么,找了TJ(没有CTJ)甚至玄学的照着TJ改了很多地方的写法,结果还是RuntimeErrow
想问问怎么改