杭电oj2047-2049、2051-2053、2056、2058
2047 阿牛的EOF牛肉串
1 #include<stdio.h> 2 3 int main(){ 4 int n,i; 5 _int64 s[51]; 6 while(~scanf("%d",&n)){ 7 s[1]=3;s[2]=8; 8 for(i=3;i<=n;i++){ 9 s[i] = s[i-1]*2 + s[i-2]*2; 10 } 11 printf("%I64d\n",s[n]); 12 } 13 14 15 }
2048 神、上帝以及老天爷
1 #include<stdio.h> 2 3 int main(){ 4 int n,m,i; 5 _int64 s[21][2]; 6 while(~scanf("%d",&n)){ 7 while(n--){ 8 scanf("%d",&m); 9 s[1][0] = 0;s[2][0] = 1;s[1][1] = 1;s[2][1] = 2; 10 for(i=3;i<=m;i++){ 11 s[i][0] = (i-1)*(s[i-1][0] + s[i-2][0]); 12 s[i][1] = s[i-1][1] * i; 13 } 14 printf("%.2lf%%\n",s[m][0]*100.00/s[m][1]); 15 } 16 } 17 18 }
转一个错排公式
错排公式推导:
当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
综上得到
D(n) = (n-1) [D(n-2) + D(n-1)]
---------------------
作者:程序小白_龙
来源:CSDN
原文:https://blog.csdn.net/dragon_dai_2017/article/details/70880960
版权声明:本文为博主原创文章,转载请附上博文链接!
2049 不容易系列之(4)——考新郎
1 #include<stdio.h> 2 3 int main(){ 4 int c,n,m,i,j; 5 _int64 s[21],num1,num2; 6 s[1] = 0;s[2] = 1; 7 for(i=3;i<21;i++){ 8 s[i] = (i-1)*(s[i-1] + s[i-2]); 9 } 10 while(~scanf("%d",&c)){ 11 while(c--){ 12 scanf("%d %d",&n,&m); 13 j=n;num1=1;num2=1; 14 for(i=m;i>0;i--){ 15 num1 *= j; 16 num2 *= i; 17 j--; 18 } 19 printf("%I64d\n",num1/num2*s[m]); 20 } 21 } 22 23 }
2051 Bitset
1 #include<stdio.h> 2 3 int main(){ 4 int n,i,j,s[50]; 5 while(~scanf("%d",&n)){ 6 i=0; 7 while(n/2>=1){ 8 s[i] = n%2; 9 i++; 10 n /= 2; 11 } 12 s[i] = 1; 13 for(j=i;j>=0;j--){ 14 printf("%d",s[j]); 15 } 16 printf("\n"); 17 } 18 19 20 }
2052 Picture
1 #include<stdio.h> 2 3 int main(){ 4 int n,m,i,j; 5 char s[80][80]; 6 while(scanf("%d %d",&n,&m)!=EOF){ 7 for(i=0;i<=m+1;i++){ 8 for(j=0;j<=n+1;j++){ 9 if(i==0 || i==m+1){ 10 s[i][j] = '-'; 11 }else if(j==0 || j==n+1){ 12 s[i][j] = '|'; 13 }else{ 14 s[i][j] = ' '; 15 } 16 } 17 } 18 s[0][0] = '+';s[0][n+1] = '+'; 19 s[m+1][0] = '+';s[m+1][n+1] = '+'; 20 for(i=0;i<=m+1;i++){ 21 for(j=0;j<=n+1;j++){ 22 printf("%c",s[i][j]); 23 } 24 printf("\n"); 25 } 26 printf("\n"); 27 } 28 }
2053 Switch Game
1 #include<stdio.h> 2 3 int main(){ 4 int n,i,count; 5 while(~scanf("%d",&n)){ 6 count = 0; 7 for(i=1;i<=n;i++){ 8 if(n%i==0){count++;} 9 } 10 if(count%2==0){printf("0\n");} 11 else{printf("1\n");} 12 } 13 }
2056 Rectangles
1 #include<stdio.h> 2 3 void sort(double s[]){ 4 int i,j; 5 double temp; 6 for(i=1;i<5;i++){ 7 for(j=4;j>i;j--){ 8 if(s[i]>s[j]){ 9 temp = s[i]; 10 s[i] = s[j]; 11 s[j] = temp; 12 } 13 } 14 } 15 16 } 17 18 int main(){ 19 int i,j; 20 double x[10],y[10],temp; 21 while(~scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x[1],&y[1],&x[2],&y[2],&x[3],&y[3],&x[4],&y[4])){ 22 if((x[3]>x[1]&&x[4]>x[1]&&x[3]>x[2]&&x[4]>x[2])||(x[3]<x[1]&&x[4]<x[1]&&x[3]<x[2]&&x[4]<x[2])||(y[3]>y[1]&&y[4]>y[1]&&y[3]>y[2]&&y[4]>y[2])||(y[3]<y[1]&&y[4]<y[1]&&y[3]<y[2]&&y[4]<y[2])){ 23 printf("0.00\n"); 24 }else{ 25 sort(x); 26 sort(y); 27 printf("%.2lf\n",(x[3]-x[2])*(y[3]-y[2])); 28 } 29 } 30 }
2058 The sum problem
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(){ 5 int n,m,i,a; 6 while(~scanf("%d %d",&n,&m)){ 7 if(n==0&&m==0){break;} 8 for(i=sqrt(m*2);i>0;i--){ 9 a = (m-(i-1)*i/2)/i; 10 if(a*i+i*(i-1)/2==m){ 11 printf("[%d,%d]\n",a,a+i-1); 12 } 13 } 14 printf("\n"); 15 } 16 }