E-小红的序列乘积2.0
题意:给定数组a,求子序列前缀积个位数为6的数字个数。
分析:只要算个位数是否为6,所以把a数组都换成个位数上的数就好了。用a数组与1到9的数字进行组合,用组合数学算出组合数。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll qpow2(ll a,ll b,ll p){
ll base=a;
ll res=1;
while(b){
if(b&1)res=(res*base)%p;
base=(base*base)%p;
b>>=1;
}
return res;
}
int main(){
int n;cin>>n;
ll a[n+10];ll ans=0;
ll mp[100],mp2[100];
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]%=10;
}
memset(mp,0,sizeof(mp));
mp[1]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=9;j++)mp2[j]=0;
for(int j=1;j<=9;j++){
int c=a[i]*j%10;
if(c==6){
ans+=mp[j]*qpow2(2,n-i,mod);
cout<<i<<" "<<mp[j]<<endl;
ans%=mod;
}
mp2[c]+=mp[j];mp2[c]%=mod;
}
for(int j=1;j<=9;j++){
mp[j]+=mp2[j];mp[j]%=mod;
}
}
cout<<ans<<endl;
return 0;
}