codeforces 407C Curious Array

Posted wuyuanyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 407C Curious Array相关的知识,希望对你有一定的参考价值。

codeforces 407C Curious Array

参考题解:https://www.cnblogs.com/ChopsticksAN/p/4908377.html

1、杨辉三角可以由多维前缀和求得。
2、“搭顺风车”的思想。
3、// 右端点减去的那个数可以用组合数学的方法思考。

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int N=101010, P=1e9+7;

int n,m;
int a[N];
ll b[111][N], jc[N], inv[N];

ll kpow(ll a,ll b) {
    ll res=1;
    while(b) {
        if(b&1) res=res*a%P;
        a=a*a%P;
        b>>=1;
    }
    return res;
}

ll upd(ll &a, ll b) {
    a=(a+b)%P;
    if(a<0) a+=P;
}

void init() {
    jc[0]=1;
    rep(i,1,N) jc[i]=jc[i-1]*i%P;
    inv[N-1]=kpow(jc[N-1], P-2);
    for(int i=N-2;~i;--i) inv[i]=inv[i+1]*(i+1)%P;
}

ll C(int n,int m) {
    return jc[n]*inv[m]%P*inv[n-m]%P;
}

int main() {
    init();
    while(~scanf("%d%d",&n,&m)) {
        ///init
        memset(b,0,sizeof(b));
        ///read
        rep(i,1,n+1) scanf("%d",a+i);
        int ma=0;
        rep(i,0,m) {
            int l,r,k;scanf("%d%d%d",&l,&r,&k);
            ma=max(ma, k);
            upd(b[k+1][l], 1);
            rep(j,1,k+2) upd(b[j][r+1], -C(k-j+r-l+1, k+1-j));
        }
        ///solve
        for(int i=ma;~i;--i) {
            ll pre=0;
            rep(j,1,n+1) {
                upd(pre, b[i+1][j]);
                upd(b[i][j], pre);
            }
        }
        rep(i,1,n+1) printf("%lld%c",(a[i]+b[0][i])%P," \\n"[i==n]);
    }
    return 0;
}

以上是关于codeforces 407C Curious Array的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 407C 组合数学(详解)

Codeforces 408 E. Curious Array

水题:HDU 5112 A Curious Matt

Curious Robin Hood(树状数组+线段树)

HDU 5112 A Curious Matt

1001 A Curious Matt