[组合数][差分]JZOJ 5922 Sequence
分析
我们知道组合数可以用杨辉三角求
然后仔细观察杨辉三角的列,发现其实是1 1 1 1 1 做了k阶前缀和的产物
那么我们对于修改,在杨辉三角上面搞个差分数组,最后前缀和就行了
本人不擅长讲数学(不会
如有深入了解需求请跳转
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const int N=5e5+10; const ll P=1e9+7; ll C[N][22],a[N][22]; int n,m; int main() { freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); C[0][0]=1; for (int i=1;i<=N-1;i++) for (int j=0;j<=min(i,20);j++) C[i][j]=(C[i-1][j]+(!j?0:C[i-1][j-1]))%P; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int l,r,k; scanf("%d%d%d",&l,&r,&k); for (int j=0;j<=k;j++) a[l][j]=(a[l][j]+C[k][k-j])%P,a[r+1][j]=(a[r+1][j]-C[k+r-l+1][k-j]+P)%P; } for (int i=1;i<=n;i++) for (int j=21;j;j--) a[i+1][j-1]=(a[i+1][j-1]+a[i][j-1]+a[i][j])%P; for (int i=1;i<=n;i++) printf("%lld\n",a[i][0]); }
在日渐沉没的世界里,我发现了你。