Description
给出一个长度为
n
的数字串,现在要往其中加
Input
第一行输入两个整数
n,k
表示串的长度和要加入的
+
数量,之后输入一个长度为
Output
输出所有方案对应的值的和,结果模 109+7
Sample Input
3 1
108
Sample Output
27
Solution
设
n
个数字从高位到低位为
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100005;
#define mod 1000000007
int fact[maxn],inv[maxn],f[maxn];
void init(int n=1e5)
{
fact[0]=1;
for(int i=1;i<=n;i++)fact[i]=(ll)i*fact[i-1]%mod;
inv[1]=1;
for(int i=2;i<=n;i++)inv[i]=mod-(ll)(mod/i)*inv[mod%i]%mod;
inv[0]=1;
for(int i=1;i<=n;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
f[0]=1;
for(int i=1;i<=n;i++)f[i]=(ll)10*f[i-1]%mod;
}
int n,k,a[maxn],s[maxn];
char c[maxn];
int C(int n,int m)
{
if(n<m||m<0)return 0;
return (ll)fact[n]*inv[m]%mod*inv[n-m]%mod;
}
void add(int &x,int y)
{
x=x+y>=mod?x+y-mod:x+y;
}
int main()
{
init();
while(~scanf("%d%d",&n,&k))
{
scanf("%s",c);
for(int i=0;i<n;i++)a[i]=c[i]-'0',s[i]=(i?s[i-1]:0)+a[i];
int ans=0;
for(int i=0;i<=n-2;i++)add(ans,(ll)s[n-2-i]*f[i]%mod*C(n-2-i,k-1)%mod);
for(int i=0;i<n;i++)add(ans,(ll)a[i]*f[n-1-i]%mod*C(i,k)%mod);
printf("%d\n",ans);
}
return 0;
}