题解 | #あなたの蛙が帰っています#

あなたの蛙が帰っています

https://ac.nowcoder.com/acm/contest/85/I

虽说出题人希望大家不被卡题意,可惜我还是被卡了。

那么就观察一下样例,如果我们把要求的记作一个函数 F(x)\mathbf F(x),那么 F(x)\mathbf F(x) 就应该满足:

  • F(3)=3\mathbf F(3)=3
  • F(9)=3432\mathbf F(9)=3432
  • F(24)=508887030\mathbf F(24)=508887030

于是我们把数字 3432 扔到 OEIS 上去,发现了这个数列:http://oeis.org/A000245

(其实很明显可以发现这个题意中答案是单调递增的,所以我们把不是单调递增的序列去掉,倒着寻找第一个含 33 的数列就是它了)

然后把它的写在脸上的递推公式找出来:a(n)=3×(2×n)!((n+2)!×(n1)!)a(n) = 3\times\dfrac{(2\times n)!}{\left((n+2)!\times(n-1)!\right)}

另外这个题意和这个数列好像有 11 单位的偏移量,复制公式的时候注意一下就好了。

#include<cstdio>
int init(){
	char c = getchar();
	int x = 0, f = 1;
	for (; c < '0' || c > '9'; c = getchar())
		if (c == '-') f = -1;
	for (; c >= '0' && c <= '9'; c = getchar())
		x = (x << 1) + (x << 3) + (c ^ 48);
	return x * f;
}
void print(int x){
	if (x < 0) x = -x, putchar('-');
	if (x > 9) print(x / 10);
	putchar(x % 10 + '0');
}
const int N = (int) 2e5 + 5, Mod = 998244353;
int fac[N], facinv[N];
int quick_mod(int a, int b){
    int s = 1;
    while (b) {
        if (b & 1) s = s * 1ll * a % Mod;
        a = a * 1ll * a % Mod; b >>= 1;
    }
    return s;
}
int A(int n){
    return 3ll * fac[2 * n] % Mod * facinv[n + 2] % Mod * facinv[n - 1] % Mod;
}
void PRINT(char*str){
    for (int i = 0; str[i]; ++i)
        putchar(str[i]);
}
signed main(){
    fac[0] = 1;
    for (int i = 1; i < N; ++i)
        fac[i] = fac[i - 1] * 1ll * i % Mod;
    facinv[N - 1] = quick_mod(fac[N - 1], Mod - 2);
    for (int i = N - 2; i >= 0; --i)
        facinv[i] = facinv[i + 1] * 1ll * (i + 1) % Mod;
    int T = init();
    for (int i = 1; i <= T; ++i) {
        int n = init();
        PRINT("Case #"), print(i);
        PRINT(": "), print(n == 1 ? 0 : A(n - 1)), putchar('\n');
    }
}
全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
我见java多妩媚:大外包
点赞 评论 收藏
分享
评论
2
1
分享
牛客网
牛客企业服务