D - FG operation
题意:给定一个长度为
n
n
n的序列。(
n
=
1
e
5
n=1e5
n=1e5)
用
F
F
F或
G
G
G这两种操作交替进行,使得最左边的两个元素转换成
(
x
+
y
)
(x+y)
(x+y)%10 或
(
x
∗
y
)
(x*y)
(x∗y) %10 ,显然在这
2
n
−
1
次
方
种
操
作
之
后
2^n-1次方种操作之后
2n−1次方种操作之后,可以使序列得到一个唯一 一个元素,求这个元素的可能的方案个数。
思路:线性dp更新状态。
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示的是前i个数中当前这个数为 j 所得到的方案个数,用前一维的
j
j
j ,来更新当前这一维的
a
[
i
]
+
j
a[i]+j
a[i]+j,可以得到状态转移方程为
d
p
[
i
]
[
a
[
i
]
+
j
]
=
d
p
[
i
]
[
a
[
i
]
+
j
]
+
d
p
[
i
−
1
]
[
j
]
dp[i][a[i]+j]=dp[i][a[i]+j]+dp[i-1][j]
dp[i][a[i]+j]=dp[i][a[i]+j]+dp[i−1][j]。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int mod = 998244353;
const int N=1e5+10;
int a[N];
int dp[N][10];
typedef long long LL;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
dp[1][a[1]]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<10;j++)
{
dp[i][(a[i]+j)%10]=(dp[i][(a[i]+j)%10]+dp[i-1][j])%mod;
dp[i][(a[i]*j)%10]=(dp[i][(a[i]*j)%10]+dp[i-1][j])%mod;
}
}
for(int i=0;i<10;i++) cout<<dp[n][i]<<endl;
}