【Codeforces】 Codeforces Round #295 (Div. 1) Pluses everywhere

点击打开链接

在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());
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值