P5239 回忆京都

xht

2019-03-02 19:14:34

Solution

杨辉三角即组合数的“打表”形式 再求一个二维前缀和 然后处理一下负数即可(因为在求前缀和的过程中有减法) ``` #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e3 + 6, P = 19260817; int t; ll f[N][N], s[N][N]; int main() { //杨辉三角 for (int i = 0; i < N; i++) f[i][i] = 1; for (int i = 0; i < N; i++) f[i][0] = 1; for (int i = 2; i < N; i++) for (int j = 1; j < i; j++) f[i][j] = (f[i-1][j-1] + f[i-1][j]) % P; //二维前缀和 for (int i = 1; i < N; i++) for (int j = 1; j < N; j++) s[i][j] = (s[i-1][j] + s[i][j-1] - s[i-1][j-1] + f[i][j]) % P; cin >> t; while (t--) { int n, m; cin >> n >> m; cout << (s[m][n] + P) % P << endl;//注意可能为负数,处理一下即可(不处理貌似只有70) } return 0; } ```