問題作った「パスカルの三角形クエリ」

解答書きました: http://d.hatena.ne.jp/anta1/20130201/1359651597
※一瞬このブログに別の問題文を載せてましたが、問題変えました
※少しの発想で作っただけで、よく考えたりしていないので、質は良いとはいえないです。

問題

サイズN(≦10^3)の、段yの幅はy+1の三角形グリッドがある。各点は数値を持っており最初は0。
Q(≦10^4)個のクエリを処理した後の状態を出力せよ。
クエリx,y,k(k≦10^3,x≦y,y≦N-k):パスカルの三角形の最初のk段を(x,y)から下にmod10^9+7で足す

問題文だけじゃわからないところもある思うので、ナイーブにやるコード

#include <cstdio>
int main() {
	static const long long MOD = 1000000007;
	int N, Q;
	static long long a[1111][1111];

	static long long C[1111][1111];
	for(int i = 0; i <= 1000; i ++) {
		C[i][0] = 1;
		for(int j = 1; j <= i; j ++) {
			if((C[i][j] = C[i-1][j-1] + C[i-1][j]) >= MOD)
				C[i][j] -= MOD;
		}
	}

	scanf("%d", &N);
	scanf("%d", &Q);
	for(int ii = 0; ii < Q; ii ++) {
		int x, y, k;
		scanf("%d%d%d", &x, &y, &k);
		for(int i = 0; i < k; i ++) {
			for(int j = 0; j <= i; j ++) {
				if((a[y + i][x + j] += C[i][j]) >= MOD)
					a[y + i][x + j] -= MOD;
			}
		}
	}
	for(int i = 0; i < N; i ++) {
		for(int j = 0; j <= i; j ++) {
			printf("%I64d%c", a[i][j], j == i ? '\n' : ' ');
		}
	}
	return 0;
}

その他

時間制限はTopCoderサーバーくらいで2秒程度。

想定解は誰かが解いてくれるか数日たったら書く

(もしも解いてくれる人がいたらこのエントリにコメントかトラックバックTwitterにmentionで)