Kaosar və XOR#12228

Kaosar və XOR (Həll təhlili)

Problemin Müəllifi:

Al Kaosar Hüseyn

Hazırlayan:

Hasan Saleh (MathModel)

Redaktə edən:

Hasan Saleh (MathModel)

Həll Siz \mathcal{O}(n^2) üzrə bir brute force yaza bilərsiniz və aşağıdakıları müşahidə edə bilərsiniz:

Bəzi tam ədəd üçün

\displaystyle \begin{cases} n=2^k \implies 2^{k+1}-2 \\ n \neq 2^k \implies 2^{\lceil \log_2(n) \rceil}-1 \end{cases}

Sübut :

1-ci nöqtə :

Bəzi tam ədədlər n \le 2^m olduqda, onda bütün 1 \le i,j \le n üçün bütün \text{popcnt}(i \oplus j) < 2^m.

2-ci nöqtə :

-i ən çox bitdə ikili formada yazın. Onun ən yüksək bitinin yeri k<m olsun. Onda i=2^k, j=i \oplus x seçin, çünki x<2^m, j<2^m-dir və çünki n>2^{m-1}, beləliklə i \oplus j=x.

3-cü nöqtə : 2-nin qüvvətləri üçün, eyni proses ən yüksək bitin (2^{m-1}) istisnası ilə baş verir, buna görə də cavab bu halda 2n-2-dir.


#if n=2-nin qüvvəti, onda cavab 2*n-2
#if n 2-nin qüvvəti deyilsə, 2^(ceil(log2(n))-1

MOD=10**9+7

p=[1]
cur=1
for i in range(1,62):
    cur*=2
    p.append(cur)
    
def solve():
    n=int(input())
    if(n==2):
        print(1)
        return
    if(n in p):
        print((2*n-2)%MOD)
    else:
        log=0
        while(n>0):
            n//=2
            log+=1
        print((pow(2,log,MOD)-1)%MOD)
for _ in range(int(input())):
    solve()

Komplekslik .