http://codeforces.com/gym/102174/problem/J
J. 金色传说
time limit per test
1.0 s
memory limit per test
256 MB
input
standard input
output
standard output
龙老师获得了一个不寻常的计算器,因为这个道具的品质是金色传说。它除了在按 666 时可以发出声音以外,还可以输入一个算式并计算出它的结果。金色传说计算器的显示屏上只有 n 个可以显示的位置,而且只有 0⋯9十个数字键和两个运算符键+、-共 12 个按键可以按,连=都没有,所以必须输入一个 n 位的合法算式,它才会自动计算出该算式的结果。
我们定义合法的算式为一个长度恰好为 n 的字符串,其中字符串只包含数字 0⋯9 和运算符+、-,同时不允许算式第一个或最后一个位置出现运算符,也不允许同时有两个运算符相邻。算式的计算结果是对该字符串模拟十进制加减法运算得到的结果,只包含数字的算式其计算结果等于它本身。如果金色传说计算器的输入不是一个合法的算式,那么它就不能得到任何计算结果。例如,在 n=6 时,1+2+3、+12345、23+45+和123+-4都不是合法的算式,而123456和0+0+0都是合法的算式。注意,前导零是允许在算式中出现的。
龙老师一个个地数出了计算器的显示位置数 nn。他想知道,如果把所有的合法的算式全都都输入一次,金色传说计算器输出的所有计算结果之和是多少?计算结果的总和可能很大,请输出它对 998244353 取模之后的答案。
Input
第一行输入一个正整数 T (1≤T≤100),表示数据组数。
接下来 T 组数据,每组数据输入一个正整数 n (1≤n≤5×105),表示金色传说计算器的显示位。
Output
对于每组数据,请输出一个非负整数,表示所有计算结果之和取模 998244353之后的答案,注意换行。
Example
input
Copy
5 1 2 3 4 5
output
Copy
45 4950 500400 50103000 19816235
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5e5+10;
const ll mod=998244353;
ll a[maxn],b[maxn];
ll quickpow(ll a,ll b)
{
ll ret=1;
while(b)
{
if(b%2) ret=ret*a%mod;
a=a*a%mod;
b/=2;
}
return ret;
}
int main()
{
a[1]=45,a[2]=4950;
b[1]=10,b[2]=100;
for(int i=3;i<maxn;i++)
{
b[i]=(b[i-1]*10+b[i-2]*20)%mod; //长度为i时有多少种不同的样子,包括符号和数字
a[i]=quickpow(10,i)*(quickpow(10,i)-1)/2%mod; //0-i个9的总和
}
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
ll ans=a[n];
for(int i=2;i<n;i++)//符号位置
{
//第i位时符号,a[i-1]是前i-1位所有的数总和,b[n-i]是后面n-i位数一共有多少种不同的组合
ans=(ans+(1LL*2*b[n-i]*a[i-1]%mod))%mod;
}
printf("%lld\n",ans);
}
return 0;
}
//(10^n*(10^n-1))/2