zoukankan      html  css  js  c++  java
  • vijosP1687 细菌总数

    vijosP1687 细菌总数

    链接:https://vijos.org/p/1687

    【思路】

      错排公式+高精度。

      题目要求排列数目而且不能有Pi==i的情况出现,可以看出这正是1,2,3,4,5,…n的错排数目。应用错排公式以及高精高精加、高精单精乘即可。

     

    【代码】

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 using namespace std;
     5 
     6 struct Bign{
     7     int len,N[3001];
     8     Bign() {
     9         memset(N,0,sizeof(N));
    10     }
    11 };
    12 
    13 int n;
    14 
    15 void Add(Bign& a,Bign b) {
    16     a.len=max(a.len,b.len);
    17     for(int i=0;i<a.len;i++) {
    18         a.N[i] += b.N[i];
    19         a.N[i+1] += a.N[i]/10;
    20         a.N[i] %= 10;
    21     }
    22     if(a.N[a.len]) a.len++;
    23 }
    24 
    25 void multi(Bign& a,int x)
    26 {
    27     for(int j=0;j<a.len;j++) a.N[j] *= x;
    28     int i=0;
    29     while(i<a.len || a.N[i]>10) {
    30         a.N[i+1] += a.N[i]/10;
    31         a.N[i] %= 10;
    32         i++;                    //i++
    33     }
    34     if(a.N[i]) a.len=i+1;  //判断
    35     else a.len=i;
    36 }
    37 
    38 int main() {
    39     cin>>n;
    40     Bign D[3];
    41     D[0].len=D[1].len=D[2].len=1; D[0].N[0]=1; D[1].N[0]=0;
    42     for(int i=2;i<=n;i++) 
    43     {
    44        memset(D[2].N,0,sizeof(D[2].N));
    45        Add(D[2],D[0]); Add(D[2],D[1]);
    46        multi(D[2],i-1);
    47        D[0]=D[1]; D[1]=D[2];
    48     }
    49     for(int i=D[2].len-1;i>=0;i--) cout<<D[2].N[i];
    50     return 0;
    51 }
  • 相关阅读:
    TypeScript入门
    github个人博客绑定单独阿里域名指南
    搜索引擎命令大全!
    Linux入门基础篇
    CSS之BFC、IFC、FFC and GFC
    陀螺仪属性介绍和实战
    web语义化,从松散到实战
    前端跨域深入理解
    快速安装自己的Sublime系列
    hint.css使用说明
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4877030.html
Copyright © 2011-2022 走看看