首页 > 其他 > 详细

HDU 2048 2049 (错位排列)

时间:2020-05-14 10:18:55      阅读:62      评论:0      收藏:0      [点我收藏+]

 

错位排列递推式

f[0] = 0; f[1] = 0;

f[i] = (i - 1) * (f[i - 1] + f[i - 2]);

 

HDU 2048

全错位排列

技术分享图片
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define UI unsigned int
#define mem(i, j) memset(i, j, sizeof(i))
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
#define make make_pair
#define INF 0x3f3f3f3f
#define inf LLONG_MAX
#define PI acos(-1)
#define fir first
#define sec second
#define lb(x) ((x) & (-(x)))
#define dbg(x) cout<<#x<<" = "<<x<<endl;
using namespace std;

const int N = 255;

LL f[30], fac[30];

void init() {

    f[0] = 0; f[1] = 0; f[2] = 1;

    rep(i, 3, 20) f[i] = (i - 1) * (f[i - 1] + f[i - 2]);

    fac[0] = 1;

    rep(i, 1, 20) fac[i] = 1LL * i * fac[i - 1];

}

void solve() {

    int n;

    scanf("%d", &n);

    printf("%.2f%%\n", (double)((1.0 * f[n]) / (1.0 * fac[n])) * 100.0);

}

int main() {

    init();

    int _; scanf("%d", &_);
    while(_--) solve();

//    solve();

    return 0;
}
2048

 

HDU 2049

n对中,恰好有 m 对选错的方案数:C(n, m) * f[n]

技术分享图片
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define UI unsigned int
#define mem(i, j) memset(i, j, sizeof(i))
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
#define make make_pair
#define INF 0x3f3f3f3f
#define inf LLONG_MAX
#define PI acos(-1)
#define fir first
#define sec second
#define lb(x) ((x) & (-(x)))
#define dbg(x) cout<<#x<<" = "<<x<<endl;
using namespace std;

const int N = 255;

LL f[30], fac[30];

void init() {

    f[0] = 0; f[1] = 0; f[2] = 1;

    rep(i, 3, 20) f[i] = (i - 1) * (f[i - 1] + f[i - 2]);

    fac[0] = 1;

    rep(i, 1, 20) fac[i] = 1LL * i * fac[i - 1];

}

void solve() {

    int n, m;

    scanf("%d %d", &n, &m);

    LL ans = fac[n] / (fac[m] * fac[n - m]);

    ans *= f[m];

    printf("%lld\n", ans);

}

int main() {

    init();

    int _; scanf("%d", &_);
    while(_--) solve();

//    solve();

    return 0;
}
2049

 

 

HDU 2048 2049 (错位排列)

原文:https://www.cnblogs.com/Willems/p/12886420.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!