CodeChef - NWAYS 组合数 朱世杰恒等式

这道题目数据有坑,白浪费一个小时!

题意:求\(\sum_{i=1}^n\sum_{j=1}^n{|i-j|+k \choose k}\)

知识点: 朱世杰恒等式,\(\sum_{i=r}^n{i \choose r}={n+1 \choose r+1},r<n\)

题解:首先去除式子中的绝对值,考虑对称性还有i=j时的重复,原式可转化为\(2\sum_{i=1}^n\sum_{j=i}^n{j-i+k \choose k}-n\)

对式子内部循环调用一遍朱世杰恒等式\(\sum_{j=i}^n{j-i+k \choose k}=\sum_{j=k}^{k+n-i}{j \choose k}={{k+n-i+1} \choose {k+1}}\) (对中间式子有疑惑的可自行展开)

再对外部循环调用一遍\(\sum_{i=1}^n{{k+n-i+1} \choose {k+1}}=\sum_{i=k+1}^{k+n}{i \choose {k+1}}={{k+n+1} \choose {k+2}}\)

福利:\(\sum_{i=m}^n{i \choose r}={n+1 \choose r+1}-{m \choose r+1}\)

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
const int maxn = 2e6+111;////
ll jie[maxn],inv[maxn];
ll fpw(ll a,ll n){
    ll ans=1;
    while(n){
        if(n&1) ans=(ans*a)%mod;
        n>>=1; a=(a*a)%mod;
    }
    return ans;
}
ll C(ll n,ll k){
    ll up=jie[n];
    ll down=inv[k]*inv[n-k]%mod;
    return (up*down)%mod;
}
int main(){
    ll T; scanf("%lld",&T);
    jie[0]=inv[0]=1;
    rep(i,1,maxn-2) jie[i]=(jie[i-1]*i)%mod;
    rep(i,1,maxn-2) inv[i]=fpw(jie[i],mod-2);
    while(T--){
        ll n,k; scanf("%lld%lld",&n,&k);
        ll tmp=C(n+k+1,k+2);
        ll ans=((tmp*2)%mod-n+mod)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/caturra/p/8454713.html

时间: 2024-10-09 23:17:38

CodeChef - NWAYS 组合数 朱世杰恒等式的相关文章

二项式系数点滴

递推式: C( n, m ) = C( n - 1, m - 1 ) + C( n - 1, m )      PS: C( n, 0 )  = 1, C( 0, n ) = 0 关系式: C( n, m ) = ( n / m ) * C( n - 1, m - 1 )(counting two ways) C( n, i ) * C( i , m ) = C( n, m ) * C( n - i, m - i ) (counting two ways) C( n, m ) = ( ( n +

AtCoder ABC 154E Almost Everywhere Zero

题目链接:https://atcoder.jp/contests/abc154/tasks/abc154_e 题目大意 给定一个整数N($1 \leq N \leq 10^{100}$)和K($1 \leq K \leq 3$),求[1, N]区间内数位上只有K个非零数的整数个数. 分析 找一下规律即可,详情见代码注释. 代码如下 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 /*-------------------Define

codechef Count Relations(组合数 二项式定理)

题意 求有多少元素属于$1 \sim N$的集合满足 R1 = {(x,y):x和y属于B,x不是y的子集,y不是x的子集,x和y的交集等于空集} R2 = {(x,y):x和y属于B,x不是y的子集,y不是x的子集,x和y的交集不等于空集} Sol 神仙题啊Orz 我整整推了两个小时才推出来 首先写暴力 /* */ #include<iostream> #include<cstdio> #include<cstring> //#define int long long

组合数

从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合: 从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数. combinatorial number   /      在线性写法中被写作C(m,n). c(m,n)=p(m,n)/n!=m!/((m-n)!*n!)  组合数的计算:C(n,k)有多种解法,1,dp递推:2,直接计算:3,lucas定理 性质: 性质1 C(n,m)= C(n,n-m)互补性质

Lucas定理及组合数取模

引入: 组合数C(m,n)表示在m个不同的元素中取出n个元素(不要求有序),产生的方案数.定义式:C(m,n)=m!/(n!*(m-n)!)(并不会使用LaTex QAQ). 根据题目中对组合数的需要,有不同的计算方法. (1)在模k的意义下求出C(i,j)(1≤j≤i≤n)共n2 (数量级)个组合数: 运用一个数学上的组合恒等式(OI中称之为杨辉三角):C(m,n)=C(m-1,n-1)+C(m-1,n). 证明: 1.直接将组合数化为定义式暴力通分再合并.过程略. 2.运用组合数的含义:设m

CodeForces 785 D Anton and School - 2 范德蒙恒等式

Anton and School - 2 题解: 枚举每个左括号作为必选的. 那么方案数就应该是下面的 1 , 然后不断化简, 通过范德蒙恒等式 , 可以将其化为一个组合数. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdou

6476. 【GDOI2020模拟02.19】A(范德蒙恒等式)

题目描述 题解 镇♂男则反 容斥下界,上界开到大概505位,数位dp最终的和V 设边界(要大于边界)之和为S,那么答案为C(V-S-1,n-1) 根据范德蒙恒等式,C(n+m,k)=∑C(n,i)*C(m,k-i) 如果nm都是正数很好证明,把n+m分成n和m两部分,枚举n部分选择个数组合一下 这个式子其实可以拓展到负数,证明要用生成函数 关于n为负数的组合数:\(C(n,m)=n^{\underline{m}}/m!\),其实和正数时是一样的 (注意这只是为了计算范德蒙恒等式而扩展的,在一般情

[Shoi2017]组合数问题 BZOJ4870

这道题可以根据组合数的实际意义来理解,就是从n*k个物品中选择除k余r个物品的方案数,那么就可以得到用f[i][j]表示在前i个物品中,选择j个物品的方案数,其中j是对k取模后的结果,那么f[i][j]=f[i-1][j](在第i为不取)+f[i-1][(j-1+k)%k](在第i为取),可以发现,第i位只与i-1位有关系那么久可以用矩阵快速幂优化, 在做矩阵乘法的时候,要特别注意矩阵乘特别容易爆int,所以矩阵数组要开成long long 另外这道题还有一个坑点,就是当k=1,r=0是,转移到

组合数问题

组合数公式: 计算组合数的递推方法: C[i, j] := C[i - 1, j] + C[i - 1, j - 1]  (0 < i ≤ j ≤ m ≤ n) 与杨辉三角在形式上一致. 代码: for (int i = 1; i <= n; i++) { c[i][1] = i % k; c[i][i] = 1; // 预处理 } for (int i = 2; i <= n; i++) for (int j = 2; j <= i - 1; j++) // 递推 c[i][j]