2702 - 送信活动
时间限制 : 2 秒
内存限制 : 2048 MB
又是一年表白日,山东建筑大学ACM协会决定为大家做点好事,于是决定在映雪长廊举办送信活动。凡是有自己喜欢的人,都可以在信上写上自己想要表达的内容,然后由我们送到他们或她们的宿舍。这天有n个人来到映雪长廊参加这个活动,因此就有n封信。现在ACM协会决定让叉叉叉去送信,送错一封很正常,可是这叉叉叉竟然将所有的信都送错了人,现在ACM协会想知道这信传错共有多少种情况。
题目输入
第一行输入一个T,代表有T组测试数据。接下来每行包含一个整数n(1<=n<=10),表示有n封信。
题目输出
输出所有信都传错的情况数。
输入/输出样例
输入格式
3 1 3 6
输出格式
0 2 265
C语言解答
#include <stdio.h> int m = 0; int list[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int f(int n, int k) { if (k == 0) { m++; return 0; } for (int i = n; i >= 1; i--) { if (i != k && list[i] == 0) { list[i] = 1; f(n, k - 1); list[i] = 0; } } } int main() { int t; scanf("%d", &t); while (t--) { int n; scanf("%d",&n); f(n, n); printf("%d\n", m); m=0; } return 0; }
C++解答
#include<stdio.h> int a[57]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,i; a[0]=0; a[1]=0; a[2]=1; for(i=3;i<=50;i++) { a[i]=(i-1)*(a[i-1]+a[i-2]); } int t; scanf("%d",&t); while(t--) { scanf("%d",&i); printf("%d\n",a[i]); } return 0; }
Java解答
import java.util.Scanner; class Main { public static void main(String[] args) { JingSaiTiTest test=new JingSaiTiTest(); Scanner reader=new Scanner(System.in); int T=reader.nextInt();//读取一共有多少行数据 int[] s=new int[11];//方法 s[0]=0;s[1]=1;s[2]=2;s[3]=9; for(int i=4;i<11;i++){ int first=test.arrange(i+1)-1; int second=0; for(int k=1,j=i-1;k<i-1||j>0;k++,j--){ second=second+test.group(i+1, k)*s[j]; } s[i]=first-second; } for(int k=0;k<T;k++){//输出数据 int first=reader.nextInt(); for(int i=0;i<11;i++){ if(first==i){ System.out.println(s[i-1]); } } } } } class JingSaiTiTest{ public JingSaiTiTest(){ } int arrange(int a){ int k=1; for(int i=1;i<=a;i++){ k=k*i; } return k; } int group(int a,int b){ int c=arrange(a); int d=arrange(b); int e=arrange(a-b); int f=c/(d*e); return f; } int add(int a){ return 0; } }