//空间、时间复杂度均为10n的二维dp写法(较暴力) 简单好抄(
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
void solve() {
string s;
cin >> s;
int n = s.size();
s = " " + s;
//个人习惯 从1~n方便转移
vector<vector<ll>>cnt(n + 1, vector < ll>(10));
//dp数组 **以第i个元素结尾且根为j的子数组数量**
for (int i = 1; i <= n; i++) {
int t = s[i] - '0';
//遍历到当前数字
for (int j = 0; j < 10; j++) {
int d = t + j;
//枚举所有可能转移到的根
if (d >= 10)d -= 9;
//t<=9 j<=9 若和为两位数 结果减去9即为根
cnt[i][d] += cnt[i - 1][j];
/*状态转移 以第i个元素结尾的所有子数组 就是以第i-1个元素结尾的所有
子数组加上第i个元素 以及第i个元素本身(下一行的cnt[i][t] 别忘了加)*/
/*例如:当前位数字为8 那么以当前位为结尾 且根为4的子数组数目可以通过
以上一位为结尾 且根为5的子数组数目转移到*/
}
cnt[i][t]++;
}
ll ans = 0;
//不开long long 只能过30%
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 10; j++) {
ans += cnt[i][j] * j;
//将所有连续子区间的贡献拆解为
//sum(以第1~n个元素结尾的所有子区间贡献)
//所得即为答案
}
}
cout << ans << endl;
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int t = 1;
cin >> t;
while (t--) solve();
return 0;
}