E
考虑 dp ,用 d p [ i ] [ j ] dp[i][j] dp[i][j] 来代表前 i i i 个数中乘积的个位为 j j j 的序列的个数。
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int maxn = 1e5+3;
const int mod = 1e9+7;
int dp[maxn][10]; // 前 i 个数乘积的个位数为 j 的序列的个数
int ksm(int a,int b)
{
int ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
void solve()
{
int n; cin>>n;
int x;
int ans=0;
for(int i=1;i<=n;i++)
{
cin>>x;
x%=10;
for(int j=0;j<=9;j++) // 计算前面的数对答案产生的贡献,此时 dp[i][j] 的数量只记录了含当前数的且对答案产生贡献的
{
dp[i][j*x%10]+=dp[i-1][j];
dp[i][j*x%10]%=mod;
}
dp[i][x]++;
ans+=ksm(2,n-i)*dp[i][6]; // 前缀产生的贡献
ans%=mod;
for(int j=0;j<=9;j++) // 把前面累计的答案转移过来
{
dp[i][j]+=dp[i-1][j];
dp[i][j]%=mod;
}
}
cout<<ans<<endl;
return ;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}
标签:10,55,x%,牛客,int,ans,Round,dp,mod
From: https://blog.csdn.net/jinxdtaiy/article/details/141159634