NC245518. 打牌的贝贝
描述
输入描述
第一行,一个正整数,表示测试数据组数。
每组测试数据一行,包含一个整数。
输出描述
对于每组数据,输出一行,包含两个整数,分别表示、获胜的情况数量,答案对取模。
示例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]); } }