链接:http://acm.gdufe.edu.cn/Problem/read/id/1363
Problem Description:
广财建校33年了,如今迎来了她的校庆,并在今天晚上19:00举行校庆晚会。
晚会邀请了许多嘉宾,如今小财要解决如何给嘉宾安排座位的问题,
嘉宾席只有一排,每个嘉宾有一个声望值,为了方便安排位置,假设每一个嘉宾的声望值都是唯一的。
声望最高的嘉宾选择一个中间的位置,然后两边的嘉宾声望值依次递减。
现场一共来了n个嘉宾,小财想知道有多少种安排方案。
Input:
输入的第一行包括一个T(T <= 50),代表有T组数据。
每组数组一个正整数n(3 <= n <= 50)。
Output:
对于每组数据,输出”Case #x: y”(不包括引号),其中x代表数据的编号,从1开始,y代表该组数据的结果。
Sample Input:
2
3
4
Sample Output:
Case #1: 2
Case #2: 6
Hints:
第一组样例,假设声望值分别为{1,2,3},那么方案有2种,{1,3,2}和{2,3,1}。
第二组样例,假设声望值分别为{1,2,3,4},那么方案有6种,{1,4,3,2},{2,4,3,1},{3,4,2,1},{1,2,4,3},{1,3,4,2},{2,3,4,1}.。
分析:
设声望最高的嘉宾叫张三,由于张三的位置在中间,所以他的右边至少有一人,也就是他的左边可以有1到n-2人。
而且,只要坐在张三左边的k个人确定了,那k个人的顺序,以及张三右边的人的顺序都是确定的(按声望高低排序)
所以,这道题的答案其实就是:
又因为:
所以答案其实就是 (1 << (n-1)) - 2
然而此题还有个坑,数据太大long long会溢出,所以用java提交:
import java.math.*;
import java.util.*;
class Main{
public static void main(String[] args){
Scanner cin = new Scanner(System.in);
int t = cin.nextInt();
for(int k = 1; k <= t; k++){
int n = cin.nextInt();
BigInteger ans = BigInteger.ONE;
BigInteger two = new BigInteger("2");
for(int i = 1; i < n; i++)
ans = ans.multiply(two);
ans = ans.subtract(two);
System.out.printf("Case #%d: ", k);
System.out.println(ans);
}
}
}