• G


    Yinyangshi is a famous RPG game on mobile phones.

    Kim enjoys collecting cards in this game. Suppose there are n kinds of cards. If you want to get a new card, you need to pay W coins to draw a card. Each time you can only draw one card, all the cards appear randomly with same probability 1/n. Kim can get 1 coin each day. Suppose Kim has 0 coin and no cards on day 0. Every W days, Kim can draw a card with W coins. In this problem ,we define W=(n-1)!.

    Now Kim wants to know the expected days he can collect all the n kinds of cards.

    Input

    The first line an integer T(1 ≤ T ≤ 10). There are T test cases.

    The next T lines, each line an integer n. (1≤n≤3000)

    Output

    For each n, output the expected days to collect all the n kinds of cards, rounded to one decimal place.

    Sample Input

    4
    1
    2
    5
    9
    

    Sample Outpu1.0

    3.0
    274.0
    1026576.0


    队友推出公式为
    ans = n * ( 1 + 1/2 + 1/3 + … + 1/(n-1) + 1/n );
    看到n比较大 然后我就直接上大数了

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <queue>
      4 #include <cmath>
      5 #include <algorithm>
      6 #include <set>
      7 #include <iostream>
      8 #include <map>
      9 #include <stack>
     10 #include <string>
     11 #include <vector>
     12 #define  pi acos(-1.0)
     13 #define  eps 1e-6
     14 #define  fi first
     15 #define  se second
     16 #define  lson l,m,rt<<1
     17 #define  rson m+1,r,rt<<1|1
     18 #define  bug         printf("******
    ")
     19 #define  mem(a,b)    memset(a,b,sizeof(a))
     20 #define  fuck(x)     cout<<"["<<x<<"]"<<endl
     21 #define  f(a)        a*a
     22 #define  sf(n)       scanf("%d", &n)
     23 #define  sff(a,b)    scanf("%d %d", &a, &b)
     24 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
     25 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
     26 #define  pf          printf
     27 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
     28 #define  FREE(i,a,b) for(i = a; i >= b; i--)
     29 #define  FRL(i,a,b)  for(i = a; i < b; i++)
     30 #define  FRLL(i,a,b) for(i = a; i > b; i--)
     31 #define  FIN         freopen("DATA.txt","r",stdin)
     32 #define  gcd(a,b)    __gcd(a,b)
     33 #define  lowbit(x)   x&-x
     34 #pragma  comment (linker,"/STACK:102400000,102400000")
     35 using namespace std;
     36 typedef long long  LL;
     37 const int INF = 0x7fffffff;
     38 const int mod = 1e9 + 7;
     39 const int maxn = 1e5 + 10;
     40 #define MAXN 9999
     41 #define MAXSIZE 10
     42 #define DLEN 4
     43 class BigNum {
     44 private:
     45     int a[(int)1e4 + 2000];  //可以控制大数的位数
     46     int len;       //大数长度
     47 public:
     48     BigNum() {
     49         len = 1;
     50         memset(a, 0, sizeof(a));
     51     }   //构造函数
     52     BigNum(const int);       //将一个int类型的变量转化为大数
     53     BigNum(const char *);     //将一个字符串类型的变量转化为大数
     54     BigNum(const BigNum &);  //拷贝构造函数
     55     BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算
     56 
     57     friend istream &operator>>(istream &, BigNum &);   //重载输入运算符
     58     friend ostream &operator<<(ostream &, BigNum &);   //重载输出运算符
     59 
     60     BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
     61     BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
     62     BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
     63     BigNum operator/(const int &) const;    //重载除法运算符,大数对一个整数进行相除运算
     64 
     65     BigNum operator^(const int &) const;    //大数的n次方运算
     66     int operator%(const int &) const;    //大数对一个int类型的变量进行取模运算
     67     bool operator>(const BigNum &T) const;   //大数和另一个大数的大小比较
     68     bool operator>(const int &t) const;      //大数和一个int类型的变量的大小比较
     69 
     70     void print();       //输出大数
     71 };
     72 
     73 BigNum::BigNum(const int b) {   //将一个int类型的变量转化为大数
     74     int c, d = b;
     75     len = 0;
     76     memset(a, 0, sizeof(a));
     77     while (d > MAXN) {
     78         c = d - (d / (MAXN + 1)) * (MAXN + 1);
     79         d = d / (MAXN + 1);
     80         a[len++] = c;
     81     }
     82     a[len++] = d;
     83 }
     84 
     85 BigNum::BigNum(const char *s) {   //将一个字符串类型的变量转化为大数
     86     int t, k, index, l, i;
     87     memset(a, 0, sizeof(a));
     88     l = strlen(s);
     89     len = l / DLEN;
     90     if (l % DLEN)
     91         len++;
     92     index = 0;
     93     for (i = l - 1; i >= 0; i -= DLEN) {
     94         t = 0;
     95         k = i - DLEN + 1;
     96         if (k < 0)
     97             k = 0;
     98         for (int j = k; j <= i; j++)
     99             t = t * 10 + s[j] - '0';
    100         a[index++] = t;
    101     }
    102 }
    103 
    104 BigNum::BigNum(const BigNum &T) : len(T.len) { //拷贝构造函数
    105     int i;
    106     memset(a, 0, sizeof(a));
    107     for (i = 0; i < len; i++)
    108         a[i] = T.a[i];
    109 }
    110 
    111 BigNum &BigNum::operator=(const BigNum &n) { //重载赋值运算符,大数之间进行赋值运算
    112     int i;
    113     len = n.len;
    114     memset(a, 0, sizeof(a));
    115     for (i = 0; i < len; i++)
    116         a[i] = n.a[i];
    117     return *this;
    118 }
    119 
    120 istream &operator>>(istream &in, BigNum &b) { //重载输入运算符
    121     char ch[MAXSIZE * 4];
    122     int i = -1;
    123     in >> ch;
    124     int l = strlen(ch);
    125     int count = 0, sum = 0;
    126     for (i = l - 1; i >= 0;) {
    127         sum = 0;
    128         int t = 1;
    129         for (int j = 0; j < 4 && i >= 0; j++, i--, t *= 10) {
    130             sum += (ch[i] - '0') * t;
    131         }
    132         b.a[count] = sum;
    133         count++;
    134     }
    135     b.len = count++;
    136     return in;
    137 
    138 }
    139 
    140 ostream &operator<<(ostream &out, BigNum &b) { //重载输出运算符
    141     int i;
    142     cout << b.a[b.len - 1];
    143     for (i = b.len - 2; i >= 0; i--) {
    144         cout.width(DLEN);
    145         cout.fill('0');
    146         cout << b.a[i];
    147     }
    148     return out;
    149 }
    150 
    151 BigNum BigNum::operator+(const BigNum &T) const { //两个大数之间的相加运算
    152     BigNum t(*this);
    153     int i, big;      //位数
    154     big = T.len > len ? T.len : len;
    155     for (i = 0; i < big; i++) {
    156         t.a[i] += T.a[i];
    157         if (t.a[i] > MAXN) {
    158             t.a[i + 1]++;
    159             t.a[i] -= MAXN + 1;
    160         }
    161     }
    162     if (t.a[big] != 0)
    163         t.len = big + 1;
    164     else
    165         t.len = big;
    166     return t;
    167 }
    168 
    169 BigNum BigNum::operator-(const BigNum &T) const { //两个大数之间的相减运算
    170     int i, j, big;
    171     bool flag;
    172     BigNum t1, t2;
    173     if (*this > T) {
    174         t1 = *this;
    175         t2 = T;
    176         flag = 0;
    177     } else {
    178         t1 = T;
    179         t2 = *this;
    180         flag = 1;
    181     }
    182     big = t1.len;
    183     for (i = 0; i < big; i++) {
    184         if (t1.a[i] < t2.a[i]) {
    185             j = i + 1;
    186             while (t1.a[j] == 0)
    187                 j++;
    188             t1.a[j--]--;
    189             while (j > i)
    190                 t1.a[j--] += MAXN;
    191             t1.a[i] += MAXN + 1 - t2.a[i];
    192         } else
    193             t1.a[i] -= t2.a[i];
    194     }
    195     t1.len = big;
    196     while (t1.a[t1.len - 1] == 0 && t1.len > 1) {
    197         t1.len--;
    198         big--;
    199     }
    200     if (flag)
    201         t1.a[big - 1] = 0 - t1.a[big - 1];
    202     return t1;
    203 }
    204 
    205 BigNum BigNum::operator*(const BigNum &T) const { //两个大数之间的相乘运算
    206     BigNum ret;
    207     int i, j, up;
    208     int temp, temp1;
    209     for (i = 0; i < len; i++) {
    210         up = 0;
    211         for (j = 0; j < T.len; j++) {
    212             temp = a[i] * T.a[j] + ret.a[i + j] + up;
    213             if (temp > MAXN) {
    214                 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
    215                 up = temp / (MAXN + 1);
    216                 ret.a[i + j] = temp1;
    217             } else {
    218                 up = 0;
    219                 ret.a[i + j] = temp;
    220             }
    221         }
    222         if (up != 0)
    223             ret.a[i + j] = up;
    224     }
    225     ret.len = i + j;
    226     while (ret.a[ret.len - 1] == 0 && ret.len > 1)
    227         ret.len--;
    228     return ret;
    229 }
    230 
    231 BigNum BigNum::operator/(const int &b) const { //大数对一个整数进行相除运算
    232     BigNum ret;
    233     int i, down = 0;
    234     for (i = len - 1; i >= 0; i--) {
    235         ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
    236         down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
    237     }
    238     ret.len = len;
    239     while (ret.a[ret.len - 1] == 0 && ret.len > 1)
    240         ret.len--;
    241     return ret;
    242 }
    243 
    244 int BigNum::operator%(const int &b) const {  //大数对一个int类型的变量进行取模运算
    245     int i, d = 0;
    246     for (i = len - 1; i >= 0; i--) {
    247         d = ((d * (MAXN + 1)) % b + a[i]) % b;
    248     }
    249     return d;
    250 }
    251 
    252 BigNum BigNum::operator^(const int &n) const {  //大数的n次方运算
    253     BigNum t, ret(1);
    254     int i;
    255     if (n < 0)
    256         exit(-1);
    257     if (n == 0)
    258         return 1;
    259     if (n == 1)
    260         return *this;
    261     int m = n;
    262     while (m > 1) {
    263         t = *this;
    264         for (i = 1; i << 1 <= m; i <<= 1) {
    265             t = t * t;
    266         }
    267         m -= i;
    268         ret = ret * t;
    269         if (m == 1)
    270             ret = ret * (*this);
    271     }
    272     return ret;
    273 }
    274 
    275 bool BigNum::operator>(const BigNum &T) const { //大数和另一个大数的大小比较
    276     int ln;
    277     if (len > T.len)
    278         return true;
    279     else if (len == T.len) {
    280         ln = len - 1;
    281         while (a[ln] == T.a[ln] && ln >= 0)
    282             ln--;
    283         if (ln >= 0 && a[ln] > T.a[ln])
    284             return true;
    285         else
    286             return false;
    287     } else
    288         return false;
    289 }
    290 
    291 bool BigNum::operator>(const int &t) const {  //大数和一个int类型的变量的大小比较
    292     BigNum b(t);
    293     return *this > b;
    294 }
    295 
    296 void BigNum::print() {  //输出大数
    297     int i;
    298     cout << a[len - 1];
    299     for (i = len - 2; i >= 0; i--) {
    300         cout.width(DLEN);
    301         cout.fill('0');
    302         cout << a[i];
    303     }
    304     //cout << endl;
    305 }
    306 int t, n;
    307 int main() {
    308     sf(t);
    309     while(t--) {
    310         sf(n);
    311         BigNum temp = 1, ans = 0;
    312         for (int i = 1 ; i <= n ; i++) temp = temp * i;
    313         for (int i = 1 ; i <= n ; i++) {
    314             ans=ans+temp/i;
    315         }
    316         ans.print();
    317         printf(".0
    ");
    318     }
    319     return 0;
    320 }


  • 相关阅读:
    Promise小结
    Jquery 一次处理多个ajax请求的代码
    for of 与 for in的区别
    三级联动效果
    最好的拖拽js
    Unicode转义(uXXXX)的编码和解码
    禁止遮罩层以下屏幕滑动
    director.js:客户端的路由---简明中文教程
    通过CSS的border绘制三角形
    概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/9514741.html
Copyright © 2020-2023  润新知