zoukankan      html  css  js  c++  java
  • 2018年长沙理工大学第十三届程序设计竞赛 箱庭的股市

    https://www.nowcoder.com/acm/contest/96/F

    F. 箱庭的股市
    方程可以转换为A[i][j]=A[i-1][j-1]+A[i-1][j],打表后发现,每一行的后一项减去前一项,得到的
    是一个杨辉三角,因此A[i][j] = sum(C(i,k)) (0<=k<=j)

    其实按照数据范围,是会超时的,但是嘛……

    最主要的是求sum(C(i,k))的方法(程序注释)

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <list>
     6 #include <stack>
     7 #include <vector>
     8 #include <set>
     9 #include <map>
    10 #include <queue>
    11 #include <algorithm>
    12 #include <iostream>
    13 using namespace std;
    14 const long mod=1e9 + 7;
    15 const long maxn=1e6;
    16  
    17 long long f[maxn+5],a[maxn+5],b[maxn+5];
    18  
    19 int main()
    20 {
    21     long m,x,y,i,ci;
    22     long long be,r;
    23      
    24     f[0]=1;
    25     a[0]=1;
    26     for (i=1;i<=maxn;i++)
    27     {
    28         f[i]=(f[i-1]<<1)%mod;
    29         a[i]=a[i-1]*i%mod;
    30     }
    31     
    32     b[maxn]=1;
    33     ci=mod-1-1;
    34     r=a[maxn];
    35     while (ci)
    36     {
    37         if ((ci & 1)==1)
    38             b[maxn]=b[maxn]*r%mod;
    39         ci=ci>>1;
    40         r=r*r%mod;
    41     }
    42     /*
    43     a[i+1]*b[i+1] %mod = 1
    44     (a[i]*(i+1))*b[i+1] %mod = 1
    45     
    46     a[i]*b[i] %mod = 1
    47     a[i]*((i+1)*b[i+1]) %mod = 1
    48     */
    49     
    50     for (i=maxn-1;i>=1;i--)
    51         b[i]=b[i+1]*(i+1)%mod;
    52     b[0]=1;
    53     
    54     while (scanf("%ld%ld%ld%lld",&m,&x,&y,&be)!=EOF)
    55     {  
    56         x--;
    57         if (x<=y)
    58         {
    59             printf("%lld
    ",f[x]*be%mod);
    60             continue;
    61         }
    62         r=0;
    63         for (i=0;i<=y;i++)
    64             r=(r+ a[x]*b[x-i]%mod*b[i]%mod )%mod;
    65         printf("%lld
    ",r*be%mod);
    66         
    67         //x<=1e6 y<=1e4 其实如果y*2<x ,求后面的值 
    68     }
    69     return 0;
    70 }

    超时代码:

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <list>
     6 #include <stack>
     7 #include <vector>
     8 #include <set>
     9 #include <map>
    10 #include <queue>
    11 #include <algorithm>
    12 #include <iostream>
    13 using namespace std;
    14 const long mod=1e9 + 7;
    15 const long maxn=1e4+5;
    16  
    17 long long f[maxn],c[maxn];
    18  
    19 int main()
    20 {
    21     long m,x,y,i,ci;
    22     long long be,a,r;
    23      
    24     f[0]=1;
    25     for (i=1;i<=10001;i++)
    26         f[i]=(f[i-1]<<1)%mod;
    27      
    28     for (i=1;i<=10001;i++)
    29         c[i]=1;
    30     for (i=0;i<=10001;i++)
    31     {
    32         ci=mod-1-1;
    33         a=i;
    34         while (ci)
    35         {
    36             if ((ci & 1)==1)
    37                 c[i]=c[i]*a%mod;
    38             ci=ci>>1;
    39             a=a*a%mod;
    40         }
    41     }
    42      
    43     while (scanf("%ld%ld%ld%lld",&m,&x,&y,&be)!=EOF)
    44     {  
    45         x--;
    46         if (x<=y)
    47         {
    48             printf("%lld
    ",f[x]*be%mod);
    49             continue;
    50         }
    51         r=0;
    52         a=1;   
    53         for (i=0;i<=y;i++)
    54         {
    55             r=(r+a)%mod;
    56             a=a*(x-i)%mod *c[i+1]%mod;
    57         }
    58         printf("%lld
    ",r*be%mod);
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    zookeeper3.5.6单机集群环境搭建
    mycat分表
    myacat分片及全局表定义
    装饰器
    函数参数,作用域
    可变,不可变,无序, 有序
    dict
    列表可变,元祖不可变
    列表操作
    字符串find
  • 原文地址:https://www.cnblogs.com/cmyg/p/8858753.html
Copyright © 2011-2022 走看看