n个数里插入k个+号,所有式子的和是多少(取模1000000007) (0 ≤ k < n ≤ 105)。

分析

1.求答案,考虑每个数作为i位数(可为答案贡献10的i-1次方,个位i=1,十位i=2,...,最多n-k位):

那么它及后面 共i个数 之间不能有加号。

且只有前n-i+1个数可以作为i位,如果是an-i+1作为i位,那么后面都不能有加号,k个加号在a1到an-i+1之间,所以有C(n-i,k)次贡献(这么说怪怪的→_←),就是几种情况。

a1 a2 a3 ... an-i+1 ... an

如果是a1、a2、...an-i作为i位,比如a1,那就是ai和ai+1之间用掉一个加号,其它加号ai+1的后面n-1-i个间隔里。

a1 a2 a3 ... a+ ai+1 ...  an

再比如a2,剩下k-1个加号在ai+2的后面及a1和a2之间 n-1-i个间隔里。

a1 a2 a3 ... ai+1 + ai+2 ...  an

所以他们都做了C(n-i-1,k-1)次贡献。

于是就有ans=∑(i=1到n-k)[(a1+a2+...an-i)*C(n-i-1,k-1)+an-i+1*C(n-i,k)]%M。

s[i]为前缀和,ans=∑(i=1到n-k)[s[n-i]*C(n-i-1,k-1)+an-i+1*C(n-i,k)]%M。

2.组合数取模

由费马小定理,当a和p互质时:ap-1≡1 mod p 可得 a*ap-2≡1 mod p,ap-2和a互为逆元。

a/b mod p=a*b-1 mod p 也就是求除数的逆元。

C(a,b)=a!/[b!*(a-b)!]

所以先求出所有1到n的阶乘,和它的逆。

代码

#include<cstdio>
#define M 1000000007
#define N 100005
#define ll long long int n,k;
char d[N];
ll s[N],fac[N],inv_fac[N];
ll inv(ll a)
{
ll b=M-;
ll ans=;
while(b)
{
if(b&) ans=ans*a%M;
a=a*a%M;
b>>=;
}
return ans;
}
void init()
{
//初始化fac[i]i的阶乘,inv_fac[i] i的阶乘的逆元
fac[]=;
for(int i=; i<=n; i++)
{
fac[i]=fac[i-]*i;
if(fac[i]>=M) fac[i]%=M;
}
inv_fac[n]=inv(fac[n]);
for(int i=n-;i>=;i--){ //乘(i!的逆)==除以i!==除以(i+1)!再乘以(i+1)==乘((i+1)!的逆)再乘以i+1
inv_fac[i]=inv_fac[i+]*(i+);
if(inv_fac[i]>=M) inv_fac[i]%=M;
}
} ll C(ll a,ll b)
{
return fac[a]*inv_fac[b]%M *inv_fac[a-b]%M;
}
int main()
{
scanf("%d%d ",&n,&k);
for(int i=; i<=n; i++)
{
scanf("%c",&d[i]);
s[i]=s[i-]+(d[i]-'');
}
init();
ll ans=;
ll de=;
for(ll i=; n-i>=k; i++)
{
ans+=(d[n-i+]-'')*C(n-i,k)%M*de%M;
ans+=s[n-i]*C(n-i-,k-)%M*de%M;
de*=;
if (de>=M) de%=M;
if (ans>=M) ans%=M;
}
printf("%I64d",ans);
return ;
}

  

【CodeForces 520E】Pluses everywhere的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第一,二,三,,四,五章)

    SQL - Structured  Query Language (结构化查询语言) 1/ SQL 命令的类型 : 数据定义语言: DDL 数据操作语言: DML 数据查询语言: DQL 数据控制语言 ...

  2. VA助手(Visual Assist X) 笔记

    官方网站:http://www.wholetomato.com/ 一. 快捷键 Shift+Alt+F Find References 查找引用 Shift+Alt+S FindSynbolDialo ...

  3. TestLink学习六:TestLink1.9.13工作使用小结

    Testlink是一款强大的用例追踪和管理工具.测试管理注重的实际上就是一个流程. 1.默认当测试用例同名时,就会有提示.(以前版本需要修改配置) 2.测试用例序号:(缺点) 1)删除一个测试用例之后 ...

  4. java 12 - 5 带有缓冲区的字符流

    字符流为了高效读写,也提供了对应的字符缓冲流. 字符缓冲流:A. BufferedWriter:字符缓冲输出流 B. BufferedReader:字符缓冲输入流 A.BufferedWriter:字 ...

  5. xshell5 启动显示 mfc110.dll msvcp110.dll 未找到问题 解决办法

    1. 安装 Visual C++ Redistributable for Visual Studio 2012 x86版本 注意: 一定要安装x86版本.(xshell5是32位的程序) 微软的官方下 ...

  6. IDEA 滚动条跳动问题

    关掉有道词典的 “屏幕取词” 和 “划词翻译”

  7. S2--《优化MySchool数据库设计》总结

    第一章    数据库的设计 1.1  数据库设计 数据库中创建的数据库结构的种类,以及在数据实体之间建立的复杂关系是决定数据库系统效率的重要因素. 糟糕的数据库设计表现在以下两个方面: *效率低下 * ...

  8. Windows下安装Redmine

    参考链接:http://www.cnblogs.com/afarmer/archive/2011/08/06/2129126.html 最新教程:http://www.myexception.cn/w ...

  9. Android开发环境搭建及常见问题解决方法

    转自: http://www.cnblogs.com/rwxwsblog/p/4769785.html 在移动互联网的时代,Android的份额早已超过了苹果.Android的出现无疑加速了移动互联网 ...

  10. GEOS库学习之三:空间关系、DE-9IM和谓词

    要判断两个多边形的关系,实际上属于几何图形空间关系判断.几何图形并不只有多边形一种,它包括点.线.面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂.根据前人的研究,总结出了DE-9I ...