北京师范大学第十五届ACM决赛-重现赛D Disdain Chain (规律+组合数学)

时间:2019-06-12
本文章向大家介绍北京师范大学第十五届ACM决赛-重现赛D Disdain Chain (规律+组合数学),主要包括北京师范大学第十五届ACM决赛-重现赛D Disdain Chain (规律+组合数学)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

链接:https://ac.nowcoder.com/acm/contest/3/D
来源:牛客网

Disdain Chain
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
BNU ACM校队现在有n名队员,对于任意两名队员i和j,要么i鄙视j,要么j鄙视i,需要注意的是鄙视关系并不满足传递性,即使i鄙视j、j鄙视k,也并不意味着一定有i鄙视k。小Q同学认为,如果有t名不同的队员满足a_1鄙视a_2、a_2鄙视a_3、……、a_{t-1}鄙视a_t,那么这就是一条长度为t的鄙视链。显然鄙视链越长越不利于团队建设,小Q同学希望你帮他分别算一算有多少种n个人之间的鄙视关系满足最长的鄙视链的长度是1,2,3,...,n。
输入描述:
第一行是一个正整数T(≤ 6),表示测试数据的组数, 每组测试数据包含一行,只有一个整数n(2 ≤ n ≤ 7),表示校队的人数。
输出描述:
对于每组测试数据,输出n行,第i行表示最长鄙视链是i的鄙视关系的个数。
示例1
输入
复制
1
2
输出
复制
0
2
说明
在队伍只有2名队员的情况下,无论谁鄙视谁,最长鄙视链的长度都是2。

题意:

思路:
通过画几个样例可以发现,无论怎么画,最后得到的最长长度的鄙视链的长度都是n,而种类数我们这样计算,每两个人都有2种可能,而任意两个人有2种可能,答案数就是 2^( C( n, 2) ) ,其他长度的全为0

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int t;
int n;
ll ans=0ll;
int c[10][10];
void init()
{
    c[1][1]=1;
    c[1][0]=1;
    for(int i=2;i<=9;i++)
    {
        c[i][0]=1;
        c[i][i]=1;
        for(int j=1;j<i;j++)
        {
            c[i][j]=c[i-1][j]+c[i-1][j-1];
        }
    }
    // repd(i,1,9)
    // {
    //  repd(j,1,i)
    //  {
    //      cout<<i<<" "<<j<<" "<<c[i][j]<<endl;
    //  }
    // }
}
void dfs(int pos,int x,int rm,ll num)
{
    if(pos>x)
    {
        if(rm==0)
            ans+=num;
        return;
    }
    for(int i=1;i<=rm;i++)
    {
        dfs(pos+1,x,rm-i,num*c[rm][i]);
    }
}

int main()
{
//    freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);
    gbtb;
    init();
    cin>>t;
    while(t--)
    {
        cin>>n;
        repd(i,1,n-1)
        {
            cout<<0<<endl;
        }
        int num=(n*(n-1))/2;
        cout<<(1ll<<(num))<<endl;
    }



    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

原文地址:https://www.cnblogs.com/qieqiemin/p/11013219.html