CodeForces512C-Pluses everywhere-模拟/数学/排列组合模板

经过研究可以发现,每一位的贡献是C(n-2,k-1)+C(n-3,k-1)...C(k-1,k-1)

同时还要注意加号全部在左边的情况。

这里还用了O(n)预处理O(1)组合数的模板。//妙啊。。妙。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define LL long long
 5
 6 using namespace std;
 7
 8 const int MOD = 1e9+7;
 9 const int maxn = 3e5+10;
10
11 LL f[maxn],inv[maxn],fac[maxn];
12
13 void init()
14 {
15     fac[0] = fac[1] = inv[0] = inv[1] = f[0] = f[1] = 1;
16     for(int i=2;i<maxn;i++)
17     {
18         fac[i] = fac[i-1]*i%MOD;
19         LL t = MOD/i,k = MOD%i;
20         f[i] = (MOD-t)*f[k]%MOD;
21         inv[i] = inv[i-1]*f[i]%MOD;
22     }
23 }
24
25 LL C(LL n,LL m)
26 {
27     if(n < m || m < 0) return 0;
28     return fac[n]*inv[m]%MOD*inv[n-m]%MOD;
29 }
30
31 char s[maxn];
32 int N,K;
33 LL save[maxn];
34
35 int main()
36 {
37     init();
38     while(~scanf("%d%d",&N,&K))
39     {
40         scanf("%s",s);
41         LL base = 1;
42         for(int i=1;i<=N;i++)
43         {
44             save[i] = (save[i-1]+C(N-1-i,K-1)*base%MOD)%MOD;
45             base = base*10%MOD;
46         }
47         LL ans = 0;base = 1;
48         for(int i=N-1;i>=0;i--)
49         {
50             ans += (s[i]-‘0‘)*(save[N-1-i]+C(i,K)*base%MOD)%MOD;
51             ans %= MOD;
52             base = base*10%MOD;
53         }
54         printf("%I64d\n",ans);
55     }
56 }
时间: 2024-12-18 11:19:48

CodeForces512C-Pluses everywhere-模拟/数学/排列组合模板的相关文章

高中数学排列组合

一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置. 先排末位共有 然后排首位共有 最后排其它位置共有 由分步计数原理得 二.相邻元素捆绑策略 例2. 7人站成一排 ,其中甲乙相邻且丙丁相邻, 共有多少种不同的排法. 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元素内部进行自排.由分步计数原理可得共有种不同

[CSP-S模拟测试]:排列组合(数学 or 找规律)

题目描述 $T$组数据,每次给定$n$,请求出下式的值,对$10^9+7$取模: $$C_n^0\times C_n^0+C_n^1\times C_n^1+C_n^2\times C_n^2+...+C_n^n\times C_n^n$$ 输入格式 第一行一个整数$T$,表示数据组数.接下来$T$行,每一行包含一个整数$n$,含义如题所示. 输出格式 输出$T$行,每行包含一个整数,表示对$10^9+7$取模后的答案. 样例 样例输入: 212 样例输出: 26 数据范围与提示 对于$30\%

SRM11 T1 骰子 (模拟--&gt;数学)

题目大意:一个骰子在有R*C格的矩形地图上从第一行第一格开始滚来滚去,滚完一行后以相反方向滚下一行,滚完所有格子后停.求所有时刻骰子上方的点数和. O(RC)做法:模拟.用u,f,r分别记录骰子上.前.右三面的点数. 向左滚:int d=7-u:u=r:r=d;//骰子相对面上点数和为7,d暂存底面点数,滚动后原来的右面跑到上面,底面跑到右面. 向右滚:int l=7-r:r=u; u=l;//l暂存左面点数 向下滚:int b=7-f:f=u; u=b;//b暂存后面点数 O(1)做法:数学(

noip模拟赛 排列

[问题描述] 给出一个随机的排列,请你计算最大值减最小值的差小于等于0~n-1的区间分别有多少个. 输入格式 输入文件名为sum.in. 第一行一个数T(<=10),表示数据组数 对于每一组数据: 第一行一个数n(1<=n<=100,000) 第二行n个数a1...an,表示一个随机的排列 [输出] 输出文件名为sum.out. 对于每组数据输出n行,分别表示差值小于等于0~n-1的区间个数 [输入输出样例] sum.in sum.out 1 4 3 2 4 1 4 5 7 10 [数据

乘法逆元+排列组合模板

妈妈呀我终于会写乘法逆元+排列组合了. 1 void exgcd(int a,int b,int&x,int&y){ 2 if(b==0){x=1;y=0;return;}exgcd(b,a%b,x,y);int t=x;x=y;y=t-a/b*y; 3 } 4 int qpow(int x,int y){ 5 int ans=1;x%=P;for(int i=y;i;i>>=1,x=x*x%P)if(i&1)ans=ans*x%P;return ans; 6 } 7

数字整除(南阳oj664)(模拟数学)

数字整除 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍.当且仅当差是17的倍数时,原数也是17的倍数 . 例如,34是17的倍数,因为3-20=-17是17的倍数:201不是17的倍数,因为20-5=15不是17的倍数.输入一个正整数n,你的任务是判断它是否是17的倍数. 输入 输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10^100),表示待判断的正

具有相同元素的排列组合模板

const int mod=1e9+7; typedef long long ll; //返回d=gcd(a,b);和对应于等式ax+by=d中的x,y ll extend_gcd(ll a,ll b,ll &x,ll &y) { if(a==0&&b==0) return -1;//无最大公约数 if(b==0){x=1;y=0;return a;} ll d=extend_gcd(b,a%b,y,x); y-=a/b*x; return d; } //*********

[CSP-S模拟测试]:炼金术士的疑惑(模拟+数学+高斯消元)

题目传送门(内部题70) 输入格式 第一行一个正整数$n$,表示炼金术士已知的热化学方程式数量.接下来$n$行,每行一个炼金术士已知的热化学方程式.最后一行一个炼金术士想要求解的热化学方程式,末尾记为$H=?$.每个热化学方程式都是规范的,格式如下:$a\ W\ +\ b\ X\ +\ ...\ =\ c\ Y\ +\ d\ Z\ ...\ H=\ h$表示$a$单位的$W$.$b$单位的$X$与......反应生成了$c$单位的$Y$.$d$单位的$Z$和......,吸收$h$/放出$-h$

[CERC2016]:凸轮廓线Convex Contour(模拟+数学)

题目描述 一些几何图形整齐地在一个网格图上从左往右排成一列.它们占据了连续的一段横行,每个位置恰好一个几何图形.每个图形是以下的三种之一:$1.$一个恰好充满单个格子的正方形.$2.$一个内切于单个格子的圆.$3.$一个底边与格子重合的等边三角形. 已知每个格子的边长都为$1$,请求出这些几何图形的凸包的周长. 输入格式 第一行包含一个正整数$n$,表示几何图形的个数.第二行包含$n$个字符,从左往右依次表示每个图形,$"S"$表示正方形,$"C"$表示圆形,$&q