在N个数字中添上K个+ 求总的和值
计算每一个数字对于总值的贡献。
4 2
1234
其中 1、2、3出现在个位上2次,4出现在个位上3次
1、2、3 出现在十位上1次。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#define cler(arr, val) memset(arr, val, sizeof(arr))
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define IN freopen ("in.txt" , "r" , stdin);
#define OUT freopen ("out.txt" , "w" , stdout);
typedef long long LL;
const int MAXN = 10052;
const int MAXM = 6000010;
const int INF = 0x3f3f3f3f;
const LL mod = 10e9+7;
const double eps= 1e-8;
#define lson l,m, rt<<1
#define rson m+1,r,rt<<1|1
const int N = 100000 + 5;
const int MOD = (int) 1e9+7;
int A[N],n,K;
char str[N];
int sum[N];
int F[N],Finv[N],Inv[N];
void init() {
Inv[1] = 1;
for (int i = 2; i < N; ++ i) {
Inv[i] = (LL) (MOD-MOD/i) * Inv[MOD%i] % MOD;
}
F[0] = Finv[0] = 1;
for (int i = 1; i < N; ++ i) {
F[i] = (LL) F[i-1] * i % MOD;
Finv[i] = (LL) Finv[i-1] * Inv[i] % MOD;
}
}
int comb(int a,int b) {
if (b < 0 || b > a) return 0;
return (LL) F[a] * Finv[b] % MOD * Finv[a-b] % MOD;
}
int work() {
int ret = 0;
for (int i = 1; i <= n; ++ i) //前缀和
sum[i] = sum[i-1] + A[i];
for (int len = 1,base = 1; len <= n; ++ len,base = (LL) base * 10 % MOD) {
int s = (LL) sum[n-len] * base % MOD;//n-len+1位置前面的数
ret += (LL) s * comb(n-len-1,K-1) % MOD;//n-len+1位置前面加+
ret %= MOD;
s = (LL) A[n-len+1] * base % MOD;//当前位
ret += (LL) s * comb(n-len,K) % MOD;//n-len+1位置前面不加+
ret %= MOD;
}
return ret;
}
int main()
{
init();
scanf("%d%d",&n,&K);
scanf("%s",str+1);
for (int i = 1; i <= n; ++ i)
A[i] = str[i] - '0';
printf("%d\n",work());
}