计算先喝牛奶的 N 人准备谷物碗的方法数量(算法请求)

Calculating the Number of Ways to Prepare Cereal Bowls for N People with Milk First (Algorithm Request)

提问人:Jason Christian 提问时间:10/9/2023 最后编辑:Eric PostpischilJason Christian 更新时间:10/10/2023 访问量:215

问:

我得到了以下内容:

Rigel是一位谷物爱好者,也是一位巨大的慈善家。每天他有N个人 他需要喂食。作为一个谷物爱好者,他想传播他对谷物的热爱,所以他开设了一个食品储藏室 为有需要的人提供麦片。食品储藏室有 N 个碗,总是储存 N 种不同类型的麦片 和他拥有的 N 种不同类型的牛奶。每种类型的牛奶和谷物每天都有库存,以 只为一个人服务。Rigel意识到,如果他一遍又一遍地做同样的事情,他会 最终会感到无聊。因此,他改变了每天准备谷物的方式。请注意,Rigel 是一个 坚信牛奶第一理论,鄙视任何说谷物第一是正确的方法的人。所以 当有一个空碗时,他总是会先倒牛奶。给定 N 很多人可以你可以 计算 Rigel 准备麦片碗的不同方法的数量? 注意:如果输出大于或等于 109 + 7,则取模 109 + 7

输入 程序将要求一个输入
,即 N

输出
打印 Rigel 可以制备谷物的不同方法的数量。

例子:

input: 1    output: 1
input: 2    output: 24
input: 3    output: 3240

我尝试使用以下方法解决它:

#include <stdio.h>
#include <math.h>

int main(){
    long long int n;
    scanf("%lld", &n);
    long long int result = 1;
    for (int i = 1; i <= n; i++)
    {
        result = 1;
        if (i == 1)
        {
            result = 1;
        }else{
        result = result * (i*i) * (pow(6, i-1) * pow(10, i-2));
        }
    }
    printf("%lld\n", result);
    return 0;
}

是的,对于它工作的 3 个输入,但这些是唯一的测试用例,所以我提交了程序,但它没有被接受。就我个人而言,我认为我的错误在于查找数字的算法,我希望有人可以帮助我解决这个问题。

C 算法 组合学

评论

2赞 Some programmer dude 10/9/2023
无论您使用什么“竞争”或“评判”网站,它都会告诉您失败的输入吗?然后将输入到程序中的硬编码,在您自己的系统上本地构建和调试。否则,请使用其论坛来帮助您。
1赞 Some programmer dude 10/9/2023
顺便说一句,您不应该将浮点函数用于整数幂。pow
4赞 Marvin 10/9/2023
我在代码中没有看到任何模数,所以我猜它是关于大数字的,因为它在注释中明确提到。
0赞 Jason Christian 10/9/2023
@Someprogrammerdude裁判没有给我失败的输入,它只给了我 20/100 的分数,所以你建议我用什么来替换 pow 函数
1赞 Simon Goater 10/9/2023
你能解释一下为什么 N = 2 给出 24 吗?如果有 2 个碗、麦片、牛奶和人,那么不应该是 2^4 = 16 吗?

答:

1赞 stark 10/9/2023 #1

Rigel可以从任何人开始,从P1到PN,给他们一个碗和牛奶(牛奶永远是第一位的,所有的碗都是一样的)。然后,他可以给同一个人麦片,或者给另一个人一碗牛奶,依此类推,直到所有人都有碗、牛奶和麦片。他永远不能在碗和牛奶之前给麦片。

对于 N=2,可能的订单为

p1m1 p1c1 p2m2 p2c2
p1m1 p2m2 p1c1 p2c2
p1m1 p2m2 p2c2 p1c1

乘以 P、M、C 的 8 种组合,得到 24。

对于任何 N,这与通过 NxNxN 立方体的路径有关,其中路径只能在 x、y 和 z 轴上递增步长。我假设有一个封闭形式的解决方案。

评论

0赞 Jason Christian 10/9/2023
但我认为这并不能解释 3 的输入如何为您提供 3240
0赞 Bas Visscher 10/9/2023
人不是成分,对吧?订单总是碗、牛奶、麦片。因此,组合的数量是 N^3?老实说,我觉得这个问题在细节上有点不清楚。
0赞 Ronald 10/9/2023
@BasVisscher 碗和人之间没有真正的区别(虽然人可能更容易区分)。组合数为 N!^3。但我同意这个问题需要大量重新阅读。
0赞 Ronald 10/9/2023
@JasonChristian确实如此,但解释有点长,这就是我将其作为答案发布的原因
0赞 Ronald 10/9/2023 #2

有N!排队的方法,牛奶的种类和谷物的种类也是如此。这就形成了 N!^3 个组合。(在 N = 2 的情况下,这将是 8,在 N = 3 的情况下,这将是 216)。

stark(第一个回答的人)已经列出了 N = 2 的 3 个可能的订单。

N = 3 的可能订单为:

p1m p1c p2m p2c p3m p3c
p1m p1c p2m p3m p2c p3c
p1m p1c p2m p3m p3c p2c
p1m p2m p2c p3m p3c p1c
p1m p2m p2c p3m p1c p3c
p1m p2m p2c p1c p3m p3c
p1m p2m p1c p2c p3m p3c
p1m p2m p1c p3m p2c p3c
p1m p2m p1c p3m p3c p2c
p1m p2m p3m p1c p2c p3c
p1m p2m p3m p1c p3c p2c
p1m p2m p3m p2c p1c p3c
p1m p2m p3m p2c p3c p1c
p1m p2m p3m p3c p1c p2c
p1m p2m p3m p3c p2c p1c

请注意,人员的顺序是通过将人员排列在 N 中来覆盖的!方式,因此 P1、P2 和 P3 的严格顺序。而且由于已经选择了牛奶和谷物的类型,我也懒得给它们编号。

现在 15 * 216 = 3240。

剩下的唯一问题是为可能的订单找到一个不错的闭合表达式。


加法: 对于 N = 1,只有一个可能的订单来添加牛奶和谷物。请注意,有 2 个操作需要执行。

如果添加另一个碗作为第一个碗,则可以在准备第二个碗之前、期间或之后添加谷物。这给了我们 N = 2 的 3 个可能的订单。

添加更多的碗延续了这种模式。 因此,可能的总订单数为 3 * 5 * ... * (2N - 1)

评论

0赞 Jason Christian 10/10/2023
让我试着找到一个封闭的表达式,谢谢你的帮助
0赞 Jason Christian 10/10/2023
闭合表达式可以是 N!^3 * 3 * 5**(n-2)
0赞 Ronald 10/10/2023
@JasonChristian 对于 N=2,我们有 4 个动作。因此,如果我们添加一个碗(如第 1 个),可以在 5 个地方添加谷物。因此,我们最终会得到 5 * 3 个可能的订单。如果我们再加一个碗,我们最终会得到 7 * 5 * 3 的可能订单。等等。(对于 N=1,有 2 个动作。添加一个碗为我们提供了 N=2 时找到的 3 个可能的阶数)。在 TeX 中,我会写:可能的订单数量是 $\Pi_{n=1}^{N-1} (2n+1}$。(从 3 到 2N-1 的所有奇数的乘法)。