Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 733    Accepted Submission(s): 434


Problem Description
一把钥匙有N个槽,2<N<26槽深为1,2,3,4,5,6。每钥匙至少有3个不同的深度且相连的槽其深度之差不得为5。求这样的钥匙的总数。
 

 

Input
本题无输入
 

 

Output
对2<N<26,输出满足要求的钥匙的总数。
 

 

Sample Output
N=3: 104
N=4: 904
N=5: 5880
. . . . .
N=25: 8310566473196300280
 
分析:
d1[n]表示第n个槽深以1、6结尾的个数,d2[n]表示第n个槽深以2、3、4、5结尾的个数;
d[n]=d1[n]+d2[n];
从第n-1项推第n项,分两类;
第一类:前n-1个槽深只有两个不同,且相邻只差不等于5;
           第n个槽深再分两种情况,槽深为1、6 ;槽深为2、3、4、5;
           第n个槽深为1、6的种数:2*( 4*(2^(n-2)-1) + 6*(2^(n-1)-2) ); d1[n]=2*( 4*(2^(n-2)-1) + 6*(2^(n-1)-2) );
           第n个槽深为2、3、4、5的种数:4*(3+2*3)*(2^(n-2)-2);    d2[n]=4*(3+2*3)*(2^(n-2)-2);  
第二类:前n-1个槽深已经满足条件,然后推第n个槽深的种数; 
           d1[n]+=2*(d1[n-1]/2+d2[n-1]);
           d2[n]+=4*d[n-1];
综上:d[n]=d1[n]+d2[n];     
 
View Code
 1 #include<iostream>
 2 #include<cmath>
 3 #define N 30
 4 
 5 using namespace std;
 6 
 7 long long d[N],d1[N],d2[N];
 8 
 9 int main()
10 {
11     int i;
12     long long t;
13     d1[3]=32;
14     d2[3]=72;
15     d[3]=104;
16     int n;
17     n=25;
18     for(i=4;i<=n;i++)
19     {
20         d1[i]=d1[i-1]+2*d2[i-1];
21         d2[i]=4*d[i-1];
22         t=pow(2,i+1);//如果放到下面就会溢出;照理说不会溢出的
23         d1[i]=d1[i]+4*t-32;
24         d2[i]=d2[i]+9*t-72;
25         d[i]=d1[i]+d2[i];
26     }
27     for(i=3;i<=n;i++)
28     {
29         cout<<"N="<<i<<": "<<d[i]<<endl;
30     }
31     return 0;
32 }

 

相关文章:

  • 2021-08-22
  • 2021-09-01
  • 2021-11-21
  • 2021-11-21
  • 2021-11-21
  • 2021-11-21
  • 2021-11-21
  • 2021-11-21
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-03
  • 2021-12-09
  • 2022-12-23
  • 2021-11-21
  • 2022-12-23
相关资源
相似解决方案