Permutasiya Düzgün Cəmi#12308

Permutasiya Düzgün Cəmi (Həll təhlili)

Problem Müəllifi:

Hasan Saleh (MathModel)

Hazırlayan:

Hasan Saleh (MathModel)

Redaktə edən:

Hasan Saleh (MathModel)

Həll

Bizə uzunluğu olan rəqəmlərdən ibarət simli verilir. Hər bir mövqeyi üçün, biz s_i-ni mövqeyində düzəldirik və qalan n-1 rəqəmi permutasiya edirik. Biz yalnız fərqli permutasiya nəzərə alırıq və aşağıdakıları müəyyən edirik:

f_i=\sum (\text{hər permutasiya dəyəri}) \pmod{M}, \qquad M=10^9+7.

Əsas fikir

Tam ədədləri birbaşa toplamaq əvəzinə, biz mövqelərə görə töhfələri toplayırıq. Hər şey çoxluq permutasiyalarını saymağa endirilir.

1) Əsas faktlar

Rəqəm saylarını c_0,\dots,c_9 adlandıraq.

  • rəqəminin fərqli permutasiyalarının sayı:

    \frac{m!}{\prod_{d=0}^9 c_d!}.
  • Onluq çəkilər: mövqeyi (soldan 1-indeksli) çəkisi

    10^{n-i}.

    Təyin edək

    T_n=\sum_{k=0}^{n-1}10^k.

    Beləliklə, -dən başqa bütün mövqelərin çəkilərinin cəmi

    T_n-10^{n-i}.

2) Bir mövqeyi düzəltmək

İndeksi düzəldin və

v=s_i.

Bu rəqəmi çoxluqdan çıxarın.

Düzəldilmiş mövqenin töhfəsi

Rəqəm həmişə mövqeyində oturur. Qalan n-1 rəqəm

\frac{(n-1)!}{\prod c'_d!}

şəkilində permutasiya edilə bilər.

Beləliklə, düzəldilmiş mövqenin töhfəsi

10^{n-i}\cdot v \cdot \frac{(n-1)!}{\prod c'_d!}.

Digər mövqelərin töhfəsi

İndi qalan n-1 mövqeləri nəzərə alaq.

Hələ də mövcud olan bir rəqəm dəyəri seçin. Əgər -ni bir xüsusi digər mövqeyə yerləşdirsək, qalan rəqəmlər

\frac{(n-2)!}{(c'_j-1)!\prod_{d\neq j} c'_d!}

şəkilində permutasiya edilə bilər.

Bu say hansı mövqeyi seçməyimizdən asılı deyil. Beləliklə, bütün digər mövqelər üzrə toplama sadəcə onların çəkilərinin cəmi ilə vurulur:

T_n-10^{n-i}.

Buna görə, rəqəm -nin bütün digər mövqelər üzrə ümumi töhfəsi

j \cdot \frac{(n-2)!}{(c'_j-1)!\prod_{d\neq j} c'_d!} \cdot (T_n-10^{n-i}).

Bütün j=0\dots9 üzrə toplama düzəldilməmiş mövqelərin tam töhfəsini verir.

3) Son formul

Hər şeyi bir araya gətirərək:

f_i = 10^{n-i}\cdot v \cdot \frac{(n-1)!}{\prod c'_d!} + (T_n-10^{n-i}) \cdot \sum_{j=0}^9 j \cdot \frac{(n-2)!}{(c'_j-1)!\prod_{d\neq j} c'_d!} \pmod M.

Bu, hər üçün müstəqil hesablanır.

4) Komplekslik

Rəqəmlər yalnız -dan -a qədərdir, buna görə də bütün faktorial bölmələr sabit ölçülü çoxluq üzərindədir. Hər mövqe üçün, biz rəqəmləri üzərində iterasiya edirik.

Ümumi komplekslik: .

kiçik bir sabit amillə.

Tətbiq

mod=10**9+7
mx=10**6+5
pw=[0]*mx
fc=[0]*mx
iv=[0]*mx
c=[0]*10

def solve():
    s=input().strip()
    n=len(s)
    for i in range(10):c[i]=0
    for x in s:c[int(x)]+=1
    tp=0
    for i in range(n):tp=(tp+pw[i])%mod
    for i in range(n):
        v=int(s[i])
        tp2=(tp-pw[n-i-1])%mod
        c[v]-=1
        w=fc[n-1]
        for k in range(10):w=w*iv[c[k]]%mod
        ans=pw[n-i-1]*w%mod*v%mod
        for j in range(1,10):
            c[j]-=1
            w2=fc[n-2]
            for k in range(10):w2=w2*iv[c[k]]%mod
            c[j]+=1
            ans=(ans+w2*tp2%mod*j)%mod
        c[v]+=1
        print(ans,end=' ')
    print()

pw[0]=fc[0]=iv[0]=1
for i in range(1,1000001):
    pw[i]=pw[i-1]*10%mod
    fc[i]=fc[i-1]*i%mod
    iv[i]=pow(fc[i],mod-2,mod)

for _ in range(int(input())):solve()