CodeChef submission 136784 (C++ 4.3.2) plaintext list. Status: TLE, problem SNCK03, contest SNACKDWN. By SlodziakiUWr (SlodziakiUWr), 2009-11-21 23:57:05.
#include <cstdio> #include <vector> typedef long long LL; #define MOD 1000000007 #define FORE(i,a,b) for(int i=(a);i<=(b);i++) int mod[3]; void EE (int a,int b,int c,int d,int e,int f){ if(b==0){ mod[0]=a; mod[1]=e; mod[2]=f; } else EE(b,a%b,e-(a/b)*c,f-(a/b)*d,c,d); } LL R[20005]; int odwrotnosc(int n){ EE(n,MOD,0,1,1,0); return mod[1]%MOD; } inline int npok(int n, int k){ return (R[n]*(LL)odwrotnosc((R[k]*R[n-k])%MOD))%MOD; } inline int modulo (int a){ if (a >= MOD) a-= MOD; return a; } int n, k; int A[30]; int DP[23][32][21000]; int gogo (int a, int b, int c) { if (a + 1 == b) return 1; else { if (DP[a][b][c] == -1) { DP[a][b][c] = 0; if (a % 2 == b % 2) { // przypadki ze tylko dzielimy long long ret = 0; for (int h = a + 1; h < b; h += 2) { ret += (npok ((A[b] - A[a] + 1 - c - 1 - (b!=k-1) - (a!=0)),(A[h] - A[a] + 1 - 1 - c - (a!=0)))) * (((long long)(gogo (a,h,c)) * gogo (h,b,0)) % MOD); if (ret > 1000000000000000000LL) ret %= MOD; } DP[a][b][c] = ret % MOD; } else { // przypadki ze dzielimy i odcinamy przycinamy prefiks long long ret = 0; // dzielimy for (int h = a + 2; h < b; h += 2) { ret += (npok ((A[b] - A[a] + 1 - c - 1 - (b!=k-1) - (a!=0)),(A[h] - A[a] + 1 - 1 - c - (a!=0)))) * (((long long)(gogo (a,h,c)) * gogo (h,b,0)) % MOD); if (ret > 1000000000000000000LL) ret %= MOD; } // przycinamy prefiks if (A[a] + c + (a != 0) < A[a + 1]) ret += gogo (a,b,c + 1); DP[a][b][c] = ret % MOD; } } return DP[a][b][c]; } } void doit () { for (int i = 0; i < k; ++i) { A[i]--; } for (int i = 0; i < k; ++i) for (int j = i + 1; j < k; ++j) for (int h = 0; h < A[j] - A[i] + 1; ++h) DP[i][j][h] = -1; } int main () { R[0] = 1; FORE(i,1,20000){ int j = i; R[i] = (R[i-1]*j)%MOD; } int tests; while (tests--) doit (); return 0; }
Comments

