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;
}