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 */
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!