NC50611. 树屋阶梯
描述
输入描述
一个正整数N,表示阶梯的高度。
输出描述
一个正整数,表示搭建方法的个数。
注:搭建方法个数可能很大。
示例1
输入:
3
输出:
5
说明:
Java 解法, 执行用时: 199ms, 内存消耗: 23652K, 提交时间: 2021-08-28 17:54:12
import java.io.*; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.*; public class Main { static long mod = 1; static class SegmentTree { static int l; static int r; static long v; static Node root; static long cache[]; static void build(long f[]) { cache = f; root = new Node(0, f.length - 1); } static long query(int left, int right) { l = left; r = right; return root.query(); } static void add_range(int left, int right, long value) { l = left; r = right; v = value; root.add_range(); } static void multi_range(int left, int right, long value) { l = left; r = right; v = value; root.multi_range(); } static void set_range(int left, int right) { l = left; r = right; // root.set_range(); } static class Node { // boolean seted; long setv = 1; long add = 0; int left; int right; long min_value; Node l_node; Node r_node; public Node(int l, int r) { left = l; right = r; if (l == r) { min_value = cache[l]; } else { int mid = (l + r) >> 1; l_node = new Node(l, mid); r_node = new Node(mid + 1, r); pollup(); } } private long query() { if (l <= left && r >= right) { return min_value; } else if (l > right || r < left) { return 0; } else { pushdown(); long v1 = l_node.query(); long v2 = r_node.query(); pollup(); return (v1+v2)%mod; } } private void add_range() { if (l <= left && r >= right) { add += v; min_value += v *(right-left+1); } else if (l > right || r < left) { return; } else { pushdown(); l_node.add_range(); r_node.add_range(); pollup(); } } private void multi_range() { if (l <= left && r >= right) { setv *= v; add = add*v; min_value = (min_value * v) % mod; } else if (l > right || r < left) { return; } else { pushdown(); l_node.multi_range(); r_node.multi_range(); pollup(); } } // private void set_range() { // if (l <= left && r >= right) { // seted = true; // setv = v; // add = 0; // min_value = v; // } else if (l > right || r < left) { // return; // } else { // pushdown(); // l_node.set_range(); // r_node.set_range(); // pollup(); // } // } // first multi, then add private void pushdown() { if (setv!=1) { l_node.setv *= setv; r_node.setv *= setv; l_node.min_value = l_node.min_value*setv%mod; r_node.min_value = r_node.min_value*setv%mod; l_node.add = l_node.add*setv; r_node.add = r_node.add*setv; setv = 1; } if (add != 0) { l_node.add += add; r_node.add += add; l_node.min_value += add * (l_node.right - l_node.left + 1 ); l_node.min_value %= mod; r_node.min_value += add * (r_node.right - r_node.left + 1 ); r_node.min_value %= mod; add = 0; } } private void pollup() { min_value = (l_node.min_value + r_node.min_value)%mod; } } } static class Task { public static String roundS(double result, int scale) { String fmt = String.format("%%.%df", scale); return String.format(fmt, result); // DecimalFormat df = new DecimalFormat("0.000000"); // double result = Double.parseDouble(df.format(result)); } long[][] mult(long a[][],long b[][], long mod){ int l1 = a.length; int l2 = b.length; int l3 = b[0].length; long r[][] = new long[l1][l3]; for(int i=0;i<l1;++i){ for(int j=0;j<l2;++j){ for(int k=0;k<l3;++k){ r[i][k] = (r[i][k] + a[i][j] * b[j][k]%mod)%mod; } } } return r; } long[][] add(long a[][],long b[][],long mod){ int l1 = a.length; int l2 = a[0].length; long r[][] = new long[l1][l2]; for(int i=0;i<l1;++i){ for(int j=0;j<l2;++j){ r[i][j] = (a[i][j] + b[i][j])%mod; } } return r; } long[][] ones(int len){ long r[][] = new long[len][len]; for(int i=0;i<len;++i){ r[i][i] = 1L; } return r; } long[][] quick(long a[][], int times,long mod){ int len = a.length; long ans[][] = ones(len); while(times>0){ if((times&1)==1) { ans = mult(ans, a, mod); } a = mult(a, a, mod); times >>= 1; } return ans; } BigInteger dp[] = new BigInteger[501]; BigInteger g(int n){ if(dp[n]!=null){ return dp[n]; } if(n==0){ return dp[n] = BigInteger.ONE; } BigInteger tot = BigInteger.ZERO; for(int i=n;i>=1;--i){ int s = n - i; tot = tot.add( g(s) .multiply( g(i-1))); } return dp[n] = tot; } public void solve(int testNumber, InputReader in, PrintWriter out) { int n = in.nextInt(); out.print(g(n)); } // int t = in.nextInt(); // int n = in.nextInt(); // int m = in.nextInt(); // // ct = 0; // h = new int[n];Arrays.fill(h,-1); // if(t==1) { // to = new int[m * 2]; // ne = new int[m * 2]; // // fob = new boolean[m * 2]; // }else{ // to = new int[m]; // ne = new int[m]; // // } // // // int rd[] = new int[n]; // int cd[] = new int[n]; // li = new int[m]; // tp = m-1; // // int rt= 0; // // for(int i=0;i<m;++i){ // int u = in.nextInt()-1; // int v = in.nextInt()-1; // add(u,v); // if(t==1){ // add(v,u); // } // cd[u]++; // rd[v]++; // rt = u; // } // // if(t==2){ // // for(int i=0;i<n;++i){ // if(rd[i]!=cd[i]){ // out.println("NO");return; // } // } // }else{ // // for(int i=0;i<n;++i){ // if(((rd[i]+cd[i])%2)>0){ // out.println("NO");return; // } // } // // } // // // // dfs11(rt, t); // // // // if(tp!=-1){ // out.print("NO"); // return; // } // // out.println("YES"); // // for(int i=0;i<m;++i){ // out.print(li[i]+ " "); // } // int f1[][] = new int[q][3]; // // for(int i=0;i<q;++i){ // for(int j=0;j<3;++j){ // f1[i][j] = in.nextInt(); // } // } // // // int h[] = new int[n+1]; // // Arrays.fill(h,-1); // // // int ne[] = new int[p*2+q]; // int to[] = new int[p*2+q]; // int wt[] = new int[p*2+q]; // ct = 0; // Func fk = (int x,int y,int z) -> { // to[ct] = y; // ne[ct] = h[x]; // wt[ct] = z; // h[x] = ct++; // }; // // for(int i=0;i<p;++i){ // int u = f[i][0]; // int v = f[i][1]; // // // // // fk.add(u,v,f[i][2]); // fk.add(v,u,f[i][2]); // } // // for(int i=0;i<q;++i){ // int u = f1[i][0]; // int v = f1[i][1]; // // // // // fk.add(u,v,f1[i][2]); // } // int dp[] = new int[n+1]; // Arrays.fill(dp,100000000); // dp[s] = 0; // // // PriorityQueue<int[]> qu = new PriorityQueue<>(Comparator.comparingInt((x)->x[0])); // qu.add(new int[]{0,s}); // while(qu.size()>0){ // int cc[] = qu.poll(); // int cur = cc[1]; // if(cc[0]!=dp[cur]) continue; // for(int j = h[cur];j!=-1;j=ne[j]){ // int v = to[j]; // if(dp[v] > dp[cur] + wt[j]){ // dp[v] = dp[cur] + wt[j]; // qu.offer(new int[]{dp[v],v}); // } // } // } // // for(int j=1;j<=n;++j){ // if(dp[j]==100000000){ // out.println("NO PATH"); // }else{ // out.println(dp[j]); // } // } // for(int t=0;t<5;++t) { // int at = fi[t]; // dp[at][t] = 0; // PriorityQueue<int[]> q = new PriorityQueue<>(Comparator.comparingInt((x) -> x[0])); // q.offer(new int[]{0, at}); // while (q.size() > 0) { // int cur[] = q.poll(); // if (cur[0] != dp[cur[1]][t]) continue; // int i = cur[1]; // for (int j = h[i]; j != -1; j = ne[j]) { // int v = to[j]; // if (dp[i][t] + wt[j] < dp[v][t]) { // dp[v][t] = dp[i][t] + wt[j]; // q.offer(new int[]{dp[v][t], v}); // } // } // } // } // int cl[] = new int[]{0,1,2,3,4}; // int rs = Integer.MAX_VALUE; // do{ // int s= dp[1][cl[0]]; // for(int j=0;j<4;++j){ // int nxt = fi[cl[j+1]]; // s += dp[nxt][cl[j]]; // } // rs = Math.min(rs,s); // // // }while(next_perm(cl)); // // out.print(rs); boolean next_perm(int[] a) { int len = a.length; for (int i = len - 2, j = 0; i >= 0; --i) { if (a[i] < a[i + 1]) { j = len - 1; for (; a[j] <= a[i]; --j) ; int p = a[j]; a[j] = a[i]; a[i] = p; j = i + 1; for (int ed = len - 1; j < ed; --ed) { p = a[ed]; a[ed] = a[j]; a[j++] = p; } return true; } } return false; } static long mul(long a, long b, long p) { long res = 0, base = a; while (b > 0) { if ((b & 1L) > 0) res = (res + base) % p; base = (base + base) % p; b >>= 1; } return res; } static long mod_pow(long k, long n, long p) { long res = 1L; long temp = k % p; while (n != 0L) { if ((n & 1L) == 1L) { res = mul(res, temp, p); } temp = mul(temp, temp, p); n = n >> 1L; } return res % p; } public static double roundD(double result, int scale) { BigDecimal bg = new BigDecimal(result).setScale(scale, RoundingMode.UP); return bg.doubleValue(); } } private static void solve() { InputStream inputStream = System.in; // InputStream inputStream = null; // try { // inputStream = new FileInputStream(new File("D:\\chrome_download\\exp.out")); // } catch (FileNotFoundException e) { // e.printStackTrace(); // } OutputStream outputStream = System.out; // OutputStream outputStream = null; // File f = new File("D:\\chrome_download\\"); // try { // f.createNewFile(); // } catch (IOException e) { // e.printStackTrace(); // } // try { // outputStream = new FileOutputStream(f); // } catch (FileNotFoundException e) { // e.printStackTrace(); // } InputReader in = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); Task task = new Task(); task.solve(1, in, out); out.close(); } public static void main(String[] args) { // new Thread(null, () -> solve(), "1", (1 << 30)).start(); solve(); } static class InputReader { public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream) { reader = new BufferedReader(new InputStreamReader(stream), 32768); tokenizer = null; } public String nextLine() { String line = null; try { line = reader.readLine(); } catch (IOException e) { throw new RuntimeException(e); } return line; } public String next() { while (tokenizer == null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(reader.readLine()); } catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public char nextChar() { return next().charAt(0); } public int[] nextArray(int n) { int res[] = new int[n]; for (int i = 0; i < n; ++i) { res[i] = nextInt(); } return res; } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } } }
C++(clang++ 11.0.1) 解法, 执行用时: 8ms, 内存消耗: 492K, 提交时间: 2022-11-23 17:46:44
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; int ans[100001]={},x=0; void mul(int n) { for(int i=1;i<=ans[0];++i) { ans[i]=ans[i]*n+x; x=ans[i]/10; ans[i]%=10; } while(x>0) { ans[0]++; ans[ans[0]]=x%10; x/=10; } } void div(int n) { int q=0; for(int i=ans[0];i>=1;--i) { x=(ans[i]+q*10)%n; ans[i]=(ans[i]+q*10)/n; q=x; } while(ans[ans[0]]==0) ans[0]--; } int main() { ans[0]=ans[1]=1; int n; scanf("%d",&n); for(int i=n+2;i<=(n<<1);++i) mul(i); for(int i=2;i<=n;++i) div(i); for(int i=ans[0];i>0;--i) printf("%d",ans[i]); printf("\n"); return 0; }
Python3 解法, 执行用时: 143ms, 内存消耗: 6892K, 提交时间: 2021-05-23 14:56:09
def C(a,b): ans=1 i=a j=1 while j<=b: ans*=i j+=1 i-=1 while b>0: ans//=b b-=1 return ans n=int(input()) f=[1,1,2] for i in range(3,n+1): ans=0 for j in range(i): ans+=f[j]*f[i-j-1] f.append(ans) print(f[n])