Problem Müəllifi: | Akbar Akbar |
Hazırlayan: | Hasan Saleh (MathModel) |
Redaktə edən: | Hasan Saleh (MathModel) |
Həll
Hər test halı üçün aşağıdakı dəyəri hesablamağımız lazımdır:
r=l olan terminlər (r-l) faktoru səbəbindən sıfır töhfə verir, buna görə də a\le l<r\le b olan bütün cütlər üzrə cəmi yenidən yaza bilərik. Əsas addım XOR-u standart identiklikdən istifadə edərək çıxarmaqdır:
beləliklə
Beləliklə, cavab aşağıdakı kimi olur:
burada
Notasiyaları daha aydın etmək üçün, yenidən indeksləyirik. n = b-a+1 götürək və x_i = a+i üçün i=0,\dots,n-1 müəyyən edək. a\le l<r\le b olan hər cüt (l,r) 0\le i<j<n olan (x_i,x_j) ilə uyğun gəlir və
Sonra
S_1 üçün, bütün cütlər üzrə cəmləmək əvəzinə, hər bir indeks -nın töhfəsinə ayrıca baxırıq. x_k elementi sağ ucu cütlərində i=0,\dots,k-1 ilə görünür və bu cütlərin toplam məsafəsi
Eyni zamanda, o, sol ucu (k,j) cütlərində j=k+1,\dots,n-1 ilə görünür, bu da
Beləliklə, indeks üçün toplam məsafə çəkisi
və
Bu, üzrə bir döngü ilə, hər şeyi 10^9+7 modulunda edərək həyata keçirilir.
S_2 üçün, bitləri idarə edirik. Yazmaq olar
beləliklə
burada
Bəzi bit -ni düzəldin. Yalnız bu bitin təyin olunduğu indekslərə baxın. Bu indekslərin artan sırası p_0,p_1,\dots,p_{m-1} olsun. Onda
Bunu bir keçid ilə hesablaya bilərik, cütləri açıq şəkildə saxlamadan. p_v-ni işlədərkən, onun bütün əvvəlki indekslərlə töhfəsi
Beləliklə, hər bit üçün saxlayırıq:
\text{cnt}_b = o bitin təyin olunduğu indekslərin sayı (bu -dir),
\text{sumIdx}_b = bu indekslərin cəmi,
T_b = bu bit üçün toplanmış dəyər.
İndeks -də olarkən, x = a + i olsun. -nin -ci bitinin olduğu hər bit üçün, biz yeniləyirik
Sonda, hər bit üçün T_b məlumdur və
burada \text{MOD}=10^9+7. Son cavab
Komplekslik \mathcal{O}(n + n\cdot\log n)
MOD=10**9+7
for _ in range(int(input())):
a,b=map(int, input().split())
n=b-a+1
s1=0
for i in range(n):
l=i*(i+1)//2
r=(n-i-1)*(n-i)//2
w=l+r
s1=(s1+(a+i)%MOD*(w%MOD))%MOD
c=[0]*31
si=[0]*31
t=[0]*31
for i in range(n):
x=a+i
for j in range(31):
if(x>>j&1):
t[j]+=c[j]*i-si[j]
c[j]+=1
si[j]+=i
s2=0
for j in range(31):
s2=(s2+(t[j]%MOD)*((1<<j)%MOD))%MOD
print((s1-s2)%MOD)