龙老师获得了一个不寻常的计算器,因为这个道具的品质是金色传说。它除了在按 666 时可以发出声音以外,还可以输入一个算式并计算出它的结果。金色传说计算器的显示屏上只有 n 个可以显示的位置,而且只有 0⋯9 十个数字键和两个运算符键+、-共 12 个按键可以按,连=都没有,所以必须输入一个 n位的合法算式,它才会自动计算出该算式的结果。
我们定义合法的算式为一个长度恰好为 n的字符串,其中字符串只包含数字 0⋯9 和运算符+、-,同时不允许算式第一个或最后一个位置出现运算符,也不允许同时有两个运算符相邻。算式的计算结果是对该字符串模拟十进制加减法运算得到的结果,只包含数字的算式其计算结果等于它本身。如果金色传说计算器的输入不是一个合法的算式,那么它就不能得到任何计算结果。例如,在 n=6时,1+2+3、+12345、23+45+和123+-4都不是合法的算式,而123456和0+0+00都是合法的算式。注意,前导零是允许在算式中出现的。
龙老师一个个地数出了计算器的显示位置数 n。他想知道,如果把所有的合法的算式全都都输入一次,金色传说计算器输出的所有计算结果之和是多少?计算结果的总和可能很大,请输出它对 998244353取模之后的答案。
Input
第一行输入一个正整数 T (1≤T≤100),表示数据组数。
接下来 T组数据,每组数据输入一个正整数 n (1≤n≤5×105),表示金色传说计算器的显示位。
Output
对于每组数据,请输出一个非负整数,表示所有计算结果之和取模 998244353之后的答案,注意换行。
Example
Input
5
1
2
3
4
5
Output
45
4950
500400
50103000
19816235
Note
当 n=1时,共有 0,1,⋯,9 共 10 个合法算式,它们的结果之和是 45
当 n=2时,共有 00,⋯,99 共 100 个合法算式,它们的结果之和是 4950
当 n=3时,000,⋯,999 是合法的算式,当然与形如A+B和A-B的算式也都是合法算式,它们的结果之和是 500400。
一个重要的结论是——对于统计答案,只有整个串中的第一个数字对答案是有贡献的。
知道了只有第一个出现的数对答案有贡献,那么可以枚举第一个出现运算符的位置。以这个运算符为界,前面是第一个
出现的数字,后面是一个任意的算式,两者是相互独立的。
记所有的 k 位数字的和为 s[k],记所有长度为 k 算式的个数为 num[k],那么答案即为s[n] + 2*∑s[i − 1]*num[n − i]。(i=2~n-1)。前一项为不出现运算符的情况,后一项为出现运算符时枚举第一个运算符的位置。
s[n]的话可以通过递推求得,以n=3为例,从000~999,通过等差数列求和公式可得s[3]=(10^3)*((10^3)-1)/2;
num[n]也可以通过递推求
具体不写了,电脑不好打求和符号
最后num[n]=10*num[n-1]+20*num[k-1]
注意取模
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 998244353
#define N 500005
ll s[N],num[N];
ll qpow(ll a,ll n)//注意全部开ll
{
ll sum=1;
while(n)
{
if(n&1)
{
sum=sum*a%mod;
}
a=a*a%mod;
n>>=1;
}
return sum%mod;
}
int main()
{
num[1]=10;
num[2]=100;
s[1]=45;
s[2]=4950;
for(int i=3;i<=N;i++)
{
num[i]=(10*num[i-1]+20*num[i-2])%mod;
s[i]=(qpow(10,i)*(qpow(10,i)-1)/2)%mod;
}
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
ll ans=s[n];
for(int i=2;i<=n-1;i++)
{
ans=(ans+2*s[i-1]*num[n-i])%mod;
}
cout<<ans<<endl;
}
return 0;
}