山东济南彤昌机械科技有限公司 山东济南江鹏工贸游有限公司

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 }

 

posted on 2015-10-14 11:47  hahalidaxin  阅读(172)  评论(0)    收藏  举报