题解 CF520E 【Pluses everywhere】

简介: 题目链接 ps:可能组合数一不小心打错了,请发现的大佬提出,谢谢。我们来讨论每一位数$a_{i}$被算了多少次。总共有$n-1$个空位可以放$'+'$所以,$a_{i}$左边有$i-1$个空位,右边$n-1-(i-1)$个。

题目链接

ps:可能组合数一不小心打错了,请发现的大佬提出,谢谢。

我们来讨论每一位数$a_{i}$被算了多少次。

总共有$n-1$个空位可以放$'+'$所以,$a_{i}$左边有$i-1$个空位,右边$n-1-(i-1)$个。

举个例子来说~~(手动模拟一下)~~,如果数$a_{i}$右边有一个加号,则剩下$n-2$个空位放$k-1$个加号的方案里,每种方案$a_{i}$都当做各位记录到答案里,所以对答案影响:$C^{k-1}_{n-2}*$ $a_{i}$。
假设右边第一个不放,第二个放加号,则还有$n-3$个空位,$k-2$个加号。(因为$a_{i}$右边的以为不能放加号)对答案影响: $C_{n-3}^{k-2}*10*$ $a_{i}$。

$emm……$规律好像找出来了。

这样一直递推下去~~(找规律)~~的话。到$a_{n-1}$ 和 $a_{n}$ 位填的话。对答案的影响: $C^{1}_{n-k-2}*10^{k-1}*a_{i}$

但是,我们发现,最后一位数的后面好像并不能放加号。也就是说,最后一位需要特判。。。

所以,当右边全空着的时候对答案的贡献 $10^{i}*C_{n-i-1}^{i}*a_{i}$

全部统计起来,输出就好。
代码奉上。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const long long p=1e9+7;
int n,k;
long long ans[100010];
char a[100010];

long long pen[100010];//阶乘
long long rpen[100010];//阶乘逆元
long long num[100010];//系数

long long pow2(long long a,long long b)
{
    long long res=1;
    for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;
    return res%p;
}

void rebiut()
{
    num[0]=pen[0]=rpen[0]=1;
    for(int i=1;i<=n;i++)
        pen[i]=pen[i-1]*i%p,
        rpen[i]=pow2(pen[i],p-2),
        num[i]=10*num[i-1]%p;
    return ;
}

long long C(long long n,long long k)//计算组合数,n下面,k上面
{
    if(k<0||k>n||n<0) return 0;
    else return ((pen[n]*rpen[k])%p)*rpen[n-k]%p;
}

long long now;

int main()
{
    scanf("%d%d",&n,&k);
    scanf("%s",a);
    rebiut();

    for(int i=0;i<n;i++) now=(now+num[i]*(a[n-i-1]-'0'))%p;
    if(k==0) {printf("%lld ",now);return 0;}
    
    int d=n-k-1;
    ans[0]=C(n-2,k-1);

    for(int i=0;i<=d;i++) ans[i]=(ans[i-1]+num[i]*C(n-i-2,k-1))%p;
    for(int i=d+1;i<n;i++) ans[i]=ans[i-1];
    for(int i=0;i<=d;i++) ans[i]=(ans[i]+num[i]*C(n-i-2,k))%p;
    now=0;
    for(int i=0;i<n;i++) now=(now+ans[n-i-1]*(a[i]-'0'))%p;
    printf("%lld ",now);
    return 0;
}

 

相关文章
|
机器学习/深度学习 数据采集 人工智能
人工智能安全(下)
人工智能安全(下)
1096 0
人工智能安全(下)
|
7月前
|
监控 算法 NoSQL
《服务治理》限流:微服务架构的"流量阀门"
限流是保护系统稳定的核心技术,通过控制请求速率防止过载。本文详解了固定窗口、滑动窗口、漏桶、令牌桶等算法原理与场景,并结合Sentinel实现应用级限流及Redis分布式限流,涵盖自定义限流器、动态阈值调整与监控告警体系,构建多层级防护,确保高并发下的系统可靠性与用户体验。
|
自然语言处理
高效团队的秘密:7大团队效能模型解析
3分钟了解7大团队效能模型,有效提升团队绩效。
1647 7
高效团队的秘密:7大团队效能模型解析
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
1101 9
|
程序员 数据库
深入剖析操作系统死锁:不可不知的四大条件!
大家好,我是小米。今天探讨操作系统中的死锁问题——两个或更多进程因争夺资源陷入相互等待的状态。死锁有四个必要条件:互斥、请求与保持、非剥夺及循环等待。解决策略包括:使用乐观锁破坏互斥条件;资源一次性分配避免请求与保持;允许资源剥夺;以及采用资源有序分配法消除循环等待。通过这些方法,可以有效预防和解决死锁,提升系统稳定性和效率。希望本文能帮助你更好地理解并处理死锁问题!
724 4
|
机器学习/深度学习 PyTorch 算法框架/工具
大模型微调
【7月更文挑战第31天】
863 4
|
机器学习/深度学习 自然语言处理 语音技术
使用Python实现深度学习模型:智能语音助手与家庭管理
使用Python实现深度学习模型:智能语音助手与家庭管理
582 0
|
存储 缓存 NoSQL
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
|
测试技术 程序员 Linux
【Docker项目实战】使用Docker部署blog轻量级博客系统
【2月更文挑战第16天】使用Docker部署blog轻量级博客系统
1236 2
|
JavaScript 前端开发 安全
TypeScript 常用高级类型
TypeScript 常用高级类型
834 0