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];
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 }