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:
Ə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ı:
Onluq çəkilər: mövqeyi (soldan 1-indeksli) çəkisi
Təyin edək
Beləliklə, -dən başqa bütün mövqelərin çəkilərinin cəmi
2) Bir mövqeyi düzəltmək
İndeksi düzəldin və
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
şəkilində permutasiya edilə bilər.
Beləliklə, düzəldilmiş mövqenin töhfəsi
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
şə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:
Buna görə, rəqəm -nin bütün digər mövqelər üzrə ümumi töhfəsi
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:
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()