//f[i][j]表示前i项的总和s 模n的余数为j的所有组合的集合 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> usingnamespace std; constint N = 1010, MOD = 100000007; int f[N][N]; intget_mod(int a, int b){//取正数模 return (a % b + b) % b; }
intmain(){ int n, s, a, b; cin >> n >> s >> a >> b; f[0][0] = 1; for(int i = 1; i < n; i++) for(int j = 0; j < n; j++){//j的取值为模n的取值,即 0 -> n - 1; f[i][j] = (f[i - 1][get_mod(j - a * (n - i), n)] + f[i - 1][get_mod(j + b * (n - i), n)])%MOD; } cout << f[n - 1][get_mod(s, n)] << endl; return0; }
usingnamespace std; constint N = 55, MOD = 1000000007; int f[N][N][13][14]; //f[i][j][k][c]表示从开始走到(i, j)取宝贝,当前路径价格为c的路径数; //如果到(i, j)刚好取得宝贝数为k,则记录; int w[N][N]; int m, k, n;
intmain(){ cin >> n >> m >> k; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ cin >> w[i][j]; w[i][j]++;//有n*m个格子的宝贝价格; } } f[1][1][1][w[1][1]] = 1;//第一个 f[1][1][0][0] = 1;//不取
for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(i == 1 && j == 1) continue;//第一个已经枚举过; for(int u = 0; u <= k; u++){ for(int v = 0; v <= 13; v++){ int &val = f[i][j][u][v]; val = (val + f[i - 1][j][u][v]) % MOD;// 从上方来且不取当前 val = (val + f[i][j - 1][u][v]) % MOD;// 从左边来方来且不取当前 if(u > 0 && v == w[i][j]){ for(int c = 0; c < v; c++){ val = (val + f[i - 1][j][u - 1][c]) % MOD; //递增序列长度,小于w[i][j]的前c个; val = (val + f[i][j - 1][u - 1][c]) % MOD; } } } } } } int res = 0; for(int i = 0; i <= 13; i++) res = (res + f[n][m][k][i])%MOD; cout << res; return0; }