hdu2048

#include <stdio.h>

long long a[25] = {0, 0, 1};
long long f[25] = {0, 1};
void fun()
{
    for(int i = 3; i <= 20; i++)
        a[i] = (i - 1)*a[i - 1] + (i - 1)*a[i - 2];
}

void sum()
{
    for(int i = 2; i <= 20; i++)
        f[i] = i*f[i-1];
}
int main()
{
    fun();
    sum();
    int t, n;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        printf("%.2f%%\n", (double)a[n]/f[n]*100);
    }
    return 0;
}

解题思路

a[n]代表有n个人拿到错误的名字
a[1] = 0

A

a[2] = 1

ABBA

a[3] = 2

ABCACBBACBCACABCBA

当有n个人参加时,符合的条件:

  1. 前n-1个人都拿到了错误的名字,此时第n个人可以任意的和其中一个人换
    a[n]=(n−1)∗a[n−1] a[n] = (n-1)*a[n-1] a[n]=(n1)a[n1]
  2. 前n-1个人只有一个人拿到了自己的名字,此时第n个人就和这个人换
    a[n]=(n−1)∗a[n−2] a[n] = (n-1)*a[n-2] a[n]=(n1)a[n2]
    那么,总数
    a[n]=(n−1)∗(a[n−1]+a[n−2]) a[n] = (n-1)*(a[n - 1] + a[n - 2]) a[n]=n1)(a[n1]+a[n2])

n个人,共有n!中取法,那么
P=a[n]/n! P=a[n]/n! P=a[n]/n!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值