SP5973 SELTEAM - Selecting Teams

SP5973 SELTEAM - Selecting Teams

【题目描述】

他已经有 n 个心仪的妹子了,但随着时间的流逝,只有 m(1<=m<=k)个直伴随在他的身边,而小小迪发现他只爱上了这其中的 l(1<=l<=m)个妹子从这 l 个中选出一个妹子作为他的真爱,向她告白。但小小迪并不知道未来会发生什么,他可以得知的只有 n 和 k。你作为小小迪的专属膜法师,决定帮助他算出未来会有多少种不同的爱情故指 m 个妹子不同或 l 个妹子不同或真爱不同,m,l 见上文)小小迪会历经 T 世情劫,所以你要帮他算 T 次。答案对 8388608取模。(2^23)【输入格式】第一行一个数 T。接下来 T 行每行两个数表示 n 和 k。

【输出格式】

输出 T 行 每行一个整数表示答案。

【样例输入 1】

3

2 2

7 1

5 3

【样例输出 1】

6

7

165

【数据包规模】

对于 40%的数据 1<=k<=n,T<=200;

对于另 20%的数据 T=1;

对于 100%的数据 1<=T<=10000,1<=k<=n<=10000

 

sol:如果看完题毫无思路是正确的,在你没有发现Mod=8388608=223前这就是到不可做题。

因为是223容易知道(XJB乱猜)m只要枚举到23就可以了(我怕溢出枚举到25),事实证明果然是这样(对拍拍上了)

Ps:代码真的很短,但是仍然非常丑丑丑丑丑

#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');    return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll Mod=8388608;
int T,n,Up;
ll C[100005][25];
int main()
{
    int i,j;
    C[0][0]=1;
    for(i=1;i<=100000;i++)
    {
        C[i][0]=1;
        for(j=1;j<=25;j++)
        {
            C[i][j]=(C[i-1][j-1]+C[i-1][j])%Mod;
        }
    }
    R(T);
    while(T--)
    {
        ll ans=0;
        R(n); R(Up);
        for(i=1;i<=min(25,Up);i++)
        {
            for(j=1;j<=i;j++)
            {
                ans+=C[n][i]*C[i][j]%Mod*j%Mod;
                ans-=(ans>=Mod)?Mod:0;
            }
        }
        Wl(ans);
    }
    return 0;
}
/*
input
3
2 2
7 1
5 3
output
6
7
165
*/
View Code

 

posted @ 2019-03-30 20:50  yccdu  阅读(137)  评论(0编辑  收藏  举报