小红的序列乘积2.0

思路 :

动态规划,令 表示所有考虑前 个元素的子序列种构成的题意中 f 数组最后一个元素的个位是 0...9 的个数, 表示所有前 个元素的子序列中 0...9 的个数。转移显然。

#pragma GCC optimize(3)
#pragma GCC optimize("Ofast,no-stack-protector")
#include <bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()

using namespace std ;

const int inf = 0x3f3f3f3f ;
const int LLinf = 0x3f3f3f3f3f3f3f3f ;
const int mod = 1e9 + 7 ;
const int N = 1e5 + 10 ;

int f[N][10] , d[N][10] , n , a[N] ;

void solve()
{
	cin >> n ;
	for(int i = 1 ; i <= n ; ++ i)
	{
		cin >> a[i] ;
		a[i] %= 10 ;
	}
	for(int i = 1 ; i <= n ; ++ i)
	{
		for(int j = 0 ; j <= 9 ; ++ j)
		{
			d[i][j] = d[i - 1][j] * 2 % mod ;
			f[i][j] = f[i - 1][j] ;
		}
		f[i][a[i]] ++ ; 
		d[i][a[i]] ++ ;
		for(int j = 0 ; j <= 9 ; ++ j)
		{
			int t = (j * a[i]) % 10 ;
			f[i][t] = (f[i][t] + f[i - 1][j]) % mod ;
			d[i][t] = (d[i][t] + f[i - 1][j]) % mod ;
		}
	}
	cout << d[n][6] << '\n' ;
}

signed main()
{
	cin.tie(nullptr)->ios::sync_with_stdio(false) ;

	int t = 1 ;
	// cin >> t ;

	for(int i = 1 ; i <= t ; i++)
	{
		// cout << "case #" << i << " : " << '\n' ;
		solve() ; 
	}
	return 0 ; 
}