题目
做法
第一位选除0外最小的数,其他位按从小到大选。
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int t,a[20],m;
const int mod=1e9+7;
int ksm(int a,int b){
int ans=1;
while(b){
if(b%2) ans=ans*a%mod;
b/=2;
a=a*a%mod;
}
return ans%mod;
}
signed main(){
scanf("%ull",&t);
while(t--){
scanf("%ull",&m);
int sign=-1;
for(int i=0;i<=9;i++) {
scanf("%ull",&a[i]);
if(a[i]) sign=i;
}
if(!sign) {
cout<<0<<endl;
continue;
}
if(m==1&&a[0]) {
cout<<0<<endl;
continue;
}
int ans=0;
for(int i=1;i<=9;i++){
if(a[i]){
ans=(ans+i*ksm(10,m-1))%mod;
a[i]--;
m--;
break;
}
}
if(m==0){
cout<<ans<<endl;
continue;
}
for(int i=0;i<=9;i++){
if(a[i]==0) continue;
if(m<=0) break;
if(m>=a[i]){
// for(int j=1;j<=a[i];j++){
// ans=(ans+(i*ksm(10,m-1))%mod)%mod;
// m--;
// }
ans=(ans+(((i*(ksm(10,a[i])-1))%mod*ksm(9,mod-2))%mod*ksm(10,m-a[i]))%mod)%mod;
m-=a[i];
}
else{
// int res=m;
// for(int j=1;j<=res;j++){
// ans=(ans+(i*ksm(10,m-1))%mod)%mod;
// m--;
// }
ans=( ans + ( ( i * (ksm(10,m)-1) ) %mod * ksm(9,mod-2) )%mod )%mod;
break;
}
}
cout<<ans<<endl;
}
}
wa的原因:
1.没考虑到m=1时且a[0]不为0的时候应该输出0,导致一直答案错误,运行超时也没有发现
2.运行超时