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; }标签:周赛,牛客,55,res,ll,int,base,mp,个位数 From: https://blog.csdn.net/m0_74310050/article/details/141114684