zoukankan      html  css  js  c++  java
  • ZOJ 2061 Buy the Ticket

    典型的高精度题,本着“和平共处五项原则”,我抄了一下ZXPN的代码,不过略加改进,中间也出了点问题,忘了算fac[0]了。

      1 #include<stdio.h>
      2 #include<string.h>
      3 char dp[105][105][500],fac[105][200];
      4 void add(char *s1,char *s2,char *s3)
      5 {//s3 = s1 + s2
      6     int len1 = strlen(s1);
      7     int len2 = strlen(s2);
      8     int a[10000];
      9     int k = len1 > len2 ? len1 : len2;
     10     int i,j;
     11     for(i = 0;i <= k;i++)
     12         a[i] = 0;
     13     for(i = len1 - 1,j = k;i >= 0;i--,j--)
     14     {
     15         a[j] = s1[i] - '0';
     16     }
     17     for(i = len2 - 1,j = k;i >= 0;i--,j--)
     18     {
     19         a[j] = a[j] + s2[i] - '0';
     20         a[j - 1] = a[j - 1] + a[j] / 10;
     21         a[j] %= 10;
     22     }
     23     if(a[j] >= 10)
     24     {
     25         a[j - 1] = a[j] / 10;
     26         a[j] %= 10;
     27     }
     28     i = 0;
     29     if(a[0] == 0)
     30         i = 1;
     31     for(j = i;j <= k;j++)
     32         s3[j - i] = a[j] + '0';
     33     s3[j - i] = '\0';
     34 }
     35 void mul(char *s1,char *s2,char *s3)
     36 {//s3 = s1 * s2
     37     int len1 = strlen(s1);
     38     int len2 = strlen(s2);
     39     int a[10000];
     40     int k = len1 + len2 - 1;
     41     int i,j;
     42     for(i = 0;i <= k;i++)
     43         a[i] = 0;
     44     for(i = len1 - 1;i >= 0;i--)
     45     {
     46         for(j = len2 - 1;j >= 0;j--)
     47         {
     48             a[i + j + 1] += (s1[i] - '0') * (s2[j] - '0');
     49             a[i + j] += a[i + j + 1] / 10;
     50             a[i + j + 1] %= 10;
     51         }
     52     }
     53     if(a[1] >= 10)
     54     {
     55         a[0] = a[1] / 10;
     56         a[1] %= 10;
     57     }
     58     i = 0;
     59     if(a[0] == 0)
     60         i = 1;
     61     for(j = i;j <= k;j++)
     62         s3[j - i] = a[j] + '0';
     63     s3[j- i] = '\0';
     64 }
     65 void facmul(char *s1,int n,char *s2)
     66 {//s2 = s1 * n
     67     int l,k,i,j,t,f=0;
     68     l = strlen(s1);
     69     k = l + 2;//本题n最大为100
     70     for(i = 0; i < k; i++)
     71         s2[i] = 0;
     72     for(i = l-1,j = k-1; i >= 0; i--,j--)
     73     {
     74         t = (s1[i]-'0') * n;
     75         s2[j] += t % 10;
     76         s2[j-1] += t / 10;
     77         if(s2[j] > 9)
     78             s2[j-1] += s2[j]/10,s2[j] %= 10;
     79     }
     80     if(s2[1] > 9)
     81         s2[0] += s2[1]/10,s2[1] %= 10;
     82     while(s2[f] == 0)
     83         f++;
     84     for(i = 0; i < k-f; i++)
     85         s2[i] = s2[i+f]+'0';
     86     s2[k-f] = '\0';
     87 }
     88 int main()
     89 {
     90     int i,j,a,b,n=1;
     91     strcpy(fac[0],"1");
     92     for(i = 1; i <= 100; i++)
     93         facmul(fac[i-1],i,fac[i]);
     94     for(i=0;i<=100;i++)
     95         strcpy(dp[i][0],"1");
     96     for(i=1;i<=100;i++)
     97         for(j=1;j<=i;j++)
     98             if(i==j)
     99                 strcpy(dp[i][j],dp[i][j-1]);
    100             else
    101                 add(dp[i][j-1],dp[i-1][j],dp[i][j]);
    102     for(i = 0;i <= 100;i++)
    103         for(j = 0;j <= i;j++)
    104         {
    105             mul(dp[i][j],fac[i],dp[i][j]);
    106             mul(dp[i][j],fac[j],dp[i][j]);
    107         }
    108     while(~scanf("%d%d",&a,&b),a||b)
    109     {
    110         printf("Test #%d:\n",n++);
    111         if(a < b)
    112             printf("0\n");
    113         else
    114             printf("%s\n",dp[a][b]);
    115     }
    116     return 0;
    117 }
  • 相关阅读:
    并不对劲的辛普森积分
    并不对劲的概率与期望
    并不对劲的cdq分治解三维偏序
    68.机器人的运动范围
    67.矩阵中的路径
    66.滑动窗口最大值
    65.数据流的中位数
    64.二叉搜索树的第K个节点
    63.序列化二叉树
    62.把二叉树打印成多行
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/2477947.html
Copyright © 2011-2022 走看看