列表

详情


NC245518. 打牌的贝贝

描述

BeiBeiNingNing在玩一个卡牌游戏,共有2n张卡牌,每张牌上都有一个整数,介于12n之间,所有牌上的数字都是不同的。发牌阶段二人都拿到了n张牌。每个回合,游戏的过程如下:
  1. 若此时BeiBei没有牌了,则BeiBei判负。
  2. BeiBei打出一张牌。
  3. 然后NingNing需要打出一张牌,使得其上的数字比BeiBei最新打出的一张牌上的数字大,如果此时NingNing无法打出这样的牌,则NingNing判负。
容易证明,该游戏总有一方会被判负。BeiBeiNingNing都足够聪明。考虑所有可能的分牌情况,使他们每个人正好分到n张牌。当BeiBeiNingNing都足够聪明时,求解出其中BeiBeiNingNing各自获胜的情况数量。

输入描述

第一行,一个正整数,表示测试数据组数。

每组测试数据一行,包含一个整数

输出描述

对于每组数据,输出一行,包含两个整数,分别表示BeiBeiNingNing获胜的情况数量,答案对取模。

示例1

输入:

6
1
1
4
5
1
4

输出:

1 1
1 1
56 14
210 42
1 1
56 14

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 728ms, 内存消耗: 73764K, 提交时间: 2022-11-09 19:04:20

#include <bits/stdc++.h>
using namespace std;
long long t, n, a[2<<20], inv[2<<20], b[2<<20], mod = 1e9 + 7, d;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	a[1] = inv[1] = b[1] = 1;
	for(int i = 2; i < 2000002; i++)
	{
		a[i] = a[i-1] * i % mod;
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
		b[i] = b[i-1] * inv[i] % mod;
		
	}
	for(cin >> t; t--; )
	{
		cin >> n;
		d = a[2*n] * b[n+1] % mod * b[n] % mod;
		cout << d * n % mod << " " << d << "\n";
	}
}

C++(clang++ 11.0.1) 解法, 执行用时: 659ms, 内存消耗: 34584K, 提交时间: 2022-11-15 16:44:01

#include<cstdio>
typedef long long ll;
const ll p=1e9+7;
ll a[1000001]={1},t,x;
ll in(ll a){
    ll r=1,n=p-2;
    while(n){
        if(n&1) (r*=a)%=p;(a*=a)%=p,n>>=1;
    }
    return r;
}
int main(){
    for(int i=1;i<=1e6;i++)
        a[i]=a[i-1]*(4*i-2)%p*in(i+1)%p;
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&x);
        printf("%lld %lld\n",a[x]*x%p,a[x]);
    }
}

上一题