这题ORZ。主要思想就是计算某位能成为个位、十位、百位。。等的个数。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define B(x) (1<<(x))
using namespace std;
typedef long long ll;
void cmax(int& a,int b){ if(b>a)a=b; }
void cmin(int& a,int b){ if(b<a)a=b; }
void cmax(ll& a,ll b){ if(b>a)a=b; }
void cmin(ll& a,ll b){ if(b<a)a=b; }
void add(int& a,int b,int mod){ a=(a+b)%mod; }
void add(ll& a,ll b,ll mod){ a=(a+b)%mod; }
const int oo=0x3f3f3f3f;
const ll OO=0x3f3f3f3f3f3f3f3f;
const ll MOD=1000000007;
const int maxn=100005;
ll sum[maxn],f[maxn],ten[maxn];
char str[maxn];
ll ex_gcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;
y=0;
return a;
}
ll d=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll inv(ll a,ll b){
ll x=0,y=0;
ex_gcd(a,b,x,y);
return (x%MOD+MOD)%MOD;
}
ll C(ll n,ll m){
if(n<m)return 0;
return f[n]*inv(f[m]*f[n-m]%MOD,MOD)%MOD;
}
void Init(int n,int k){
ten[0]=1;f[0]=1;
for(int i=1;i<=n;i++){
ten[i]=ten[i-1]*10%MOD;
f[i]=f[i-1]*i%MOD;
}
sum[0]=ten[0]*C(n-2,k-1);
for(int i=1;i<n-1;i++)
sum[i]=sum[i-1]+ten[i]*C(n-2-i,k-1)%MOD;
}
int main(){
//freopen("E:\\read.txt","r",stdin);
int n,k;
ll ans;
scanf("%d%d",&n,&k);
scanf("%s",str);
if(n==1){
puts(str);
return 0;
}
if(k==0){
ans=0;
for(int i=0;i<n;i++){
ans=ans*10+(str[i]-'0');
ans%=MOD;
}
cout<<ans<<endl;
return 0;
}
Init(n,k);
ans=C(n-1,k)*(str[n-1]-'0')%MOD;
for(int i=n-2;i>=0;i--){
ans+=(sum[n-i-2]+ten[n-i-1]*C(i,k)%MOD)*(str[i]-'0')%MOD;
ans%=MOD;
}
cout<<ans<<endl;
return 0;
}