Автор проблеми: | Hasan Saleh (MathModel) |
Підготовлено: | Hasan Saleh (MathModel) |
Редаговано: | Hasan Saleh (MathModel) |
Зверніть увагу, що послідовність є циклічною, що означає, що послідовність має форму
Ми можемо виконати майже все завдання, отримавши довжину циклу. Довжина циклу - це кількість завершених -цілих сегментів серед інтервалу. Довжина інтервалу становить r-l+1, отже, \displaystyle \text{цикли}=\left \lfloor \frac{r-l+1}{3} \right \rfloor
Ми отримуємо початковий індекс циклу та останній індекс, помічаючи, що цикл починається з першого в інтервалі послідовності та закінчується останнім a \oplus b в послідовності, окрім цього ми сумуємо залишкові елементи (яких не більше ), а сума циклу дорівнює (r-l+1-(r-l+1) \bmod 3) \times (a+b+a \oplus b).
Загальна складність .
Код 1
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
ll a,b,l,r;cin>>a>>b>>l>>r;
vector<ll>v={a,b,(a^b)};
ll x=0;ll y=0;
ll ans=0;
r--;l--;
int cnt=0;
for(int i=l;i<l+3;i++){
if(i%3!=0){
ans+=v[i%3];cnt++;
}else{
x=i;
break;
}
}
for(int i=r;i>r-3;i--){
if((i+3)%3!=2){
ans+=v[(i+3)%3];cnt++;
}else{
y=i;
break;
}
}
cout<<ans+((r-l+1-cnt)/3)*(v[0]+v[1]+v[2])<<"\n";
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
return 0;
}Код 2 (Скорочений)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
ll a,b,l,r;cin>>a>>b>>l>>r;
vector<ll>v={a,b,(a^b)};
ll ans=(v[0]+v[1]+v[2])*((r-l+1)/3);
ll rem=(r-l+1)%3;
ll base=(l-1)%3;
for(int i=0;i<rem;i++){
ans+=v[(base+i)%3];
}
cout<<ans<<"\n";
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
return 0;
}