제출 #341547

#제출 시각아이디문제언어결과실행 시간메모리
341547KWang31Tents (JOI18_tents)Java
100 / 100
422 ms82100 KiB
import java.io.*; import java.util.*; public class tents{ static class FastReader { BufferedReader br; StringTokenizer st; public FastReader() { br = new BufferedReader(new InputStreamReader(System.in)); } String next() { while (st == null || !st.hasMoreElements()) { try { st = new StringTokenizer(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } return st.nextToken(); } int nextInt() { return Integer.parseInt(next()); } } public static class Pair implements Comparable<Pair>{ int vtx; int val; public Pair(int a, int b){ this.vtx=a; this.val=b; } public int compareTo(Pair other){ if(this.val<other.val)return -1; if(this.val>other.val)return 1; if(this.vtx<other.vtx)return -1; return 1; } } static int MOD=1000000007; static int[] rk, p,siz; public static void main(String[] args){ FastReader br=new FastReader(); int N=br.nextInt(); int M=br.nextInt(); long[][] dp=new long[N+1][M+1]; for (int i = 0; i <=N; i++) { dp[i][0]=1; } for (int i = 1; i <=M; i++) { dp[0][i]=1; } for (int x = 1; x <=N; x++) { for (int y = 1; y <=M; y++) {//x rows, y columns dp[x][y]=dp[x][y-1]; if(x>=2){dp[x][y]+=(x*(x-1)/2)*dp[x-2][y-1]; dp[x][y]%=MOD;} dp[x][y]+=dp[x-1][y-1]*4*x; dp[x][y]%=MOD; if(y>=2)dp[x][y]+=dp[x-1][y-2]*x*(y-1); dp[x][y]%=MOD; } } System.out.println(dp[N][M]-1); } public static int find(int x, int[] p){ if(p[x]==x)return x; int ans=find(p[x],p); p[x]=ans; return ans; } public static void merge(int a, int b) { if(rk[a]<rk[b]) { p[a]=b; siz[b]+=siz[a]; }else if(rk[a]==rk[b]) { p[a]=b; rk[b]++;siz[b]+=siz[a]; }else { p[b]=a; siz[a]+=siz[b]; } } } //Debugging: //Are you sure your algorithm is correct? //Bounds: long //Special cases: n=0,1? //Make sure you remove your debugging code before you submit!
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...