Submission #850931

#TimeUsernameProblemLanguageResultExecution timeMemory
850931golionsKangaroo (CEOI16_kangaroo)Java
0 / 100
52 ms22380 KiB
//make sure to make new file! import java.io.*; import java.util.*; //connected components dp practice public class kangaroo{ public static long MOD = 1000000007L; public static void main(String[] args)throws IOException{ BufferedReader f = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(System.out); StringTokenizer st = new StringTokenizer(f.readLine()); int n = Integer.parseInt(st.nextToken()); int cs = Integer.parseInt(st.nextToken())-1; int cf = Integer.parseInt(st.nextToken())-1; //dp[x][y] -> # of ways to make the # of jump of first x indeces, such that there are y components formed //ex: jumps 2 -> 5 -> 1 -> 4 -> 3, make components starting from the 1 //no component can ever be like 123 or 321, where 2nd < 1st or 2nd to last > last //going back and forth means you can't have a_(x-1) < a_x < a_(x+1) and vice versa //if not start/end, can never have a_(x-1) < a_x, because the next element is guaranteed t long[][] dp = new long[n][n+1]; dp[0][1] = 1L; for(int k = 0; k < n-1; k++){ for(int j = 1; j <= n; j++){ if(dp[k][j] == 0L) continue; if(k+1 == cs || k+1 == cf){ //make new component at beginning/end dp[k+1][j+1] = (dp[k+1][j+1] + dp[k][j] + MOD)%MOD; //add to first/last component dp[k+1][j] = (dp[k+1][j] + dp[k][j] + MOD)%MOD; } else { //make new component dp[k+1][j+1] = (dp[k+1][j+1] + dp[k][j] * (long)(j+1) + MOD)%MOD; //join components if(j > 1){ dp[k+1][j-1] = (dp[k+1][j-1] + dp[k][j] * (long)(j-1) + MOD)%MOD; } } } } /* for(int k = 0; k < n; k++){ for(int j = 1; j <= n; j++){ out.print(dp[k][j] + " "); } out.println(); }*/ out.println(dp[n-1][1]); out.close(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...