#include <stdio.h> #define DEBUG (0) #define FROM (0) long long int cache[100][100]; long long int n, m, k, r = -100; long long int g(long long int x) { return x % k; } int main() { for(int i = 0; i < 100; i++) { for(int j = 0; j < 100; j++) { cache[i][j] = -1LL; } } cache[3][3] = 120LL; cache[3][4] = 528LL; cache[3][5] = 1737LL; cache[3][6] = 4697LL; cache[3][7] = 11032LL; cache[3][8] = 23304LL; cache[3][9] = 45321LL; cache[3][10] = 82489LL; cache[3][11] = 142208LL; cache[4][3] = 550LL; cache[4][4] = 3954LL; cache[4][5] = 19321LL; cache[4][6] = 72737LL; cache[4][7] = 226996LL; cache[4][8] = 615084LL; cache[5][3] = 2526LL; cache[5][4] = 29676LL; cache[5][5] = 215401LL; cache[5][6] = 1128983LL; cache[5][7] = 4681486LL; cache[6][3] = 11600LL; cache[6][4] = 222696LL; cache[6][5] = 2401005LL; cache[6][6] = 17520235LL; cache[7][3] = 53274LL; cache[7][4] = 1671282LL; cache[7][5] = 26765023LL; cache[8][3] = 244666LL; cache[8][4] = 12542562LL; cache[9][3] = 1123656LL; cache[10][3] = 5160518LL; cache[11][3] = 23700270LL; scanf("%lld %lld %lld", &n, &m, &k); if(n<100 && m<100 && cache[n][m] != -1LL) { r = g(cache[n][m]); } if(n == 1LL) { r = g((m*m+m)/2); } if(m == 1LL) { r = 1LL; } if(m == 2LL) { long long int a1 = 1LL, a2 = 1LL; for(int i = 1; i <= n; i++) { r = g(g(a1*2) + a2); a2 = a1; a1 = r; } } if(r < 0 && n == 2LL) { long long int a = m*(m+1); long long int b = (m*m+m+1); if(a % 2 == 0) { a /= 2LL; } else { b /= 2LL; } if(a % 3 == 0) { a /= 3LL; } else { b /= 3LL; } r = g(a)*g(b); } printf("%lld\n", g(r)); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <stdio.h> #define DEBUG (0) #define FROM (0) long long int cache[100][100]; long long int n, m, k, r = -100; long long int g(long long int x) { return x % k; } int main() { for(int i = 0; i < 100; i++) { for(int j = 0; j < 100; j++) { cache[i][j] = -1LL; } } cache[3][3] = 120LL; cache[3][4] = 528LL; cache[3][5] = 1737LL; cache[3][6] = 4697LL; cache[3][7] = 11032LL; cache[3][8] = 23304LL; cache[3][9] = 45321LL; cache[3][10] = 82489LL; cache[3][11] = 142208LL; cache[4][3] = 550LL; cache[4][4] = 3954LL; cache[4][5] = 19321LL; cache[4][6] = 72737LL; cache[4][7] = 226996LL; cache[4][8] = 615084LL; cache[5][3] = 2526LL; cache[5][4] = 29676LL; cache[5][5] = 215401LL; cache[5][6] = 1128983LL; cache[5][7] = 4681486LL; cache[6][3] = 11600LL; cache[6][4] = 222696LL; cache[6][5] = 2401005LL; cache[6][6] = 17520235LL; cache[7][3] = 53274LL; cache[7][4] = 1671282LL; cache[7][5] = 26765023LL; cache[8][3] = 244666LL; cache[8][4] = 12542562LL; cache[9][3] = 1123656LL; cache[10][3] = 5160518LL; cache[11][3] = 23700270LL; scanf("%lld %lld %lld", &n, &m, &k); if(n<100 && m<100 && cache[n][m] != -1LL) { r = g(cache[n][m]); } if(n == 1LL) { r = g((m*m+m)/2); } if(m == 1LL) { r = 1LL; } if(m == 2LL) { long long int a1 = 1LL, a2 = 1LL; for(int i = 1; i <= n; i++) { r = g(g(a1*2) + a2); a2 = a1; a1 = r; } } if(r < 0 && n == 2LL) { long long int a = m*(m+1); long long int b = (m*m+m+1); if(a % 2 == 0) { a /= 2LL; } else { b /= 2LL; } if(a % 3 == 0) { a /= 3LL; } else { b /= 3LL; } r = g(a)*g(b); } printf("%lld\n", g(r)); return 0; } |