wenbao与卡特兰数

打表 

 

 1 LL h[maxn];
 2 
 3 LL exp_mod(LL a){
 4     LL b = MOD - 2;
 5     LL res = 1;
 6     while (b){
 7         if (b & 1)
 8             res = (res*a) % MOD;
 9         b >>= 1;
10         a = (a*a) % MOD;
11     }
12     return res;
13 }
14 
15 void init(){
16     LL i;
17     h[0] = h[1] = 1;
18     for (i = 2; i < maxn; i++)
19         h[i] = (((4 * i - 2) % MOD * exp_mod(i + 1)) % MOD * h[i - 1]) % MOD;
20 }

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------

 

http://acm.hdu.edu.cn/showproblem.php?pid=1023

卡特兰数,非常好的一个练习大数的题目

 

说到大数当然首推java(python忽略)

 

 1 import java.util.*;
 2 import java.math.*;
 3 public class Main{
 4     private static BigInteger a[] = new BigInteger [105];
 5     public static void init(){
 6         BigInteger x = new BigInteger ("1");
 7         a[0] = x;
 8         for(int i = 1; i <= 100; ++i){
 9             Integer xxx = 4*i-2;
10             Integer y = i+1;
11             BigInteger xx = new BigInteger(xxx.toString()), yy = new BigInteger(y.toString());
12             a[i] = (a[i-1].multiply(xx)).divide(yy);
13             //System.out.println(a[i]);
14         }
15     }
16     public static void main(String args[]){
17         init();
18         Scanner cin = new Scanner(System.in);
19         while(cin.hasNext()){
20             int b = cin.nextInt();
21             System.out.println(a[b]);
22         }
23     }
24 }

 

 

 

不得不说java的包真的厉害,毕竟是大牛写的,优化到极致。

所以说要多看源码,多向大牛看齐!!!

 

我们可以将一个大数转化成为一个尽量大的n进制数(充分利用内存),将每一位放在数组里面。OK!就这么简单

 

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 const int maxn = 105;
 5 const int Mod = 1e5;
 6 int f[maxn][maxn];
 7 void mul(int a[], int x){
 8     int sum = 0;
 9     for(int i = maxn-1; i >= 0; --i){
10         sum += a[i]*x;
11         a[i] = sum%Mod;
12         sum /= Mod;
13     }
14 }
15 void div(int a[], int x){
16     int sum = 0;
17     for(int i = 0; i < maxn; ++i){
18         sum = (sum*Mod + a[i]);
19         a[i] = sum/x;
20         sum %= x;
21     }
22 }
23 void init(){
24     memset(f[1], 0, sizeof(int)*maxn);
25     f[1][maxn-1] = 1;
26     for(int i = 2; i <= 100; ++i){
27         memcpy(f[i], f[i-1], sizeof(int)*maxn);
28         mul(f[i], 4*i-2);
29         div(f[i], i+1);
30     }
31 }
32 void pri(int x){
33     int i;
34     for(i = 0; !f[x][i]; ++i);
35     printf("%d", f[x][i]);
36     i++;
37     for(; i < maxn; ++i){
38         printf("%05d", f[x][i]);
39     }
40     printf("\n");
41 }
42 int main(){
43     init();
44     int x;
45     while(~scanf("%d", &x)){
46         pri(x);
47     }
48     return 0;
49 }

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------

 

只有不断学习才能进步!

 

转载于:https://www.cnblogs.com/wenbao/p/6764198.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值