OneCoder Avatar
OneCodercoderli.com · 957 篇博文
二级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【GESP】C++二级练习 luogu-B3764, 计算阶乘

📅 2025-01-09·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#多重循环

GESP二级练习,多层循环和分支嵌套练习,难度★✮☆☆☆。

luogu-B3764 计算阶乘

题目要求

题目描述

相信你已经知道阶乘的定义:

n!=n×(n1)×(n2)×1n! = n \times (n - 1) \times (n - 2) \times \dots 1

现在,我们给出双阶乘的定义:

nn 为奇数时, n!!=n×(n2)×(n4)××1n!! = n \times (n - 2) \times (n - 4) \times \dots \times 1

nn 为偶数时,

n!!=n×(n2)×(n4)××2n!! = n \times (n - 2) \times (n - 4) \times \dots \times 2

特别的,0!!=10!! = 1

例如,5!!=5×3×1=155!! = 5 \times 3 \times 1 = 156!!=6×4×2=486!! = 6 \times 4 \times 2 = 48

给定整数 nn,请你求出 2×n!n!!2 \times \dfrac{n!}{n!!} 的值。

输入格式

本题单测试点内有多组测试数据

输入的第一行是一个整数,表示数据组数 TT。接下来依次给出每组数据的输入信息。

对每组数据,输入只有一行一个整数表示给定的 nn

输出格式

对每组数据,输出一行一个整数表示 2×n!n!!2 \times \dfrac{n!}{n!!} 的值。

样例输入 #1

CONSOLE 2 行
1
2

样例输出 #1

CONSOLE 1 行
2

样例输入 #2

CONSOLE 2 行
1
3

样例输出 #2

CONSOLE 1 行
4

数据规模与约定

  • 20%20\% 的数据,n2n \leq 2
  • 60%60\% 的数据,n9n \leq 9
  • 100%100\% 的数据,0n340 \leq n \leq 341T351 \leq T \leq 35

提示:

2×34!34!!<2642 \times \dfrac {34!}{34!!} < 2^{64}


题目分析

  • 为了计算 2×n!n!!2 \times \dfrac{n!}{n!!},我们首先需要输入测试用例的数量 tt 和每个测试用例的输入数 nn
  • 然后,对于每个 nn,根据 nn的奇偶性,按照不同的规则进行计算。
  • 注意到:根据定义n!n!!\dfrac{n!}{n!!},实际上可以进行化简。
    • 对于奇数 nn n!n!!=n×(n2)×(n4)××2 \dfrac{n!}{n!!} = n \times (n - 2) \times (n - 4) \times \dots \times 2
    • 对于偶数 nn n!n!!=n×(n1)×(n3)××1 \dfrac{n!}{n!!} = n \times (n - 1) \times (n - 3) \times \dots \times 1 如此,在可能保证过程中的计算结果在unsigned long long 可表示的数据范围内。

示例代码

C++ 21 行
#include <iostream>
using namespace std;
int main() {
    int t, n; // t为测试用例的数量,n为每个测试用例的输入数
    cin >> t; // 输入测试用例的数量
    for (int i = 0; i < t; i++) { // 遍历每个测试用例
        cin >> n; // 输入当前测试用例的数
        unsigned long long result = 1; // 初始化结果为1
        if (n & 1) { // 如果n是奇数
            for (int i = 2; i <= n; i += 2) { // 从2开始,每次增加2,直到n
                result *= i; // 将当前数乘入结果
            }
        } else { // 如果n是偶数
              for (int i = 1; i <= n; i += 2) { // 从1开始,每次增加2,直到n
                result *= i; // 将当前数乘入结果
            }
        }
        cout << result * 2 << endl; // 输出结果乘以2
    }
    return 0;
}

💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

读者讨论与留言

0 条讨论
✨ 支持点击留言直接回复 · Markdown 引用格式
💬 还没有读者留言,快来成为第一个讨论者吧!