计算为N个人准备麦片碗先加牛奶的方法数(算法请求)

问题描述 投票:0回答:2

我得到了以下信息:

Rigel 是一位谷物爱好者和一位伟大的慈善家。他每天都有N个人 他需要吃饭。作为一名麦片爱好者,他想传播他对麦片的热爱,因此他开设了一个食品储藏室 为有需要的人提供谷物。食品储藏室有 N 个碗,并且总是储存 N 个不同类型的麦片 他拥有N种不同类型的牛奶。每天都会储备每种类型的牛奶和谷物,以 只服务一个人。里格尔意识到,如果他一遍又一遍地做同样的事情,他就会 最终感到无聊。因此他改变了每天准备麦片的方式。请注意,Rigel 是 坚信“牛奶第一”理论,鄙视任何说“谷物第一”是正确方法的人。所以 当有空碗时,他总是先倒牛奶。给定 N 个人,你能 计算 Rigel 有多少种不同的方法来准备麦片碗? 注:如果输出大于等于10ଽ+7,则取模10ଽ+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 algorithm math combinatorics
2个回答
0
投票

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
投票

有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。

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

© www.soinside.com 2019 - 2024. All rights reserved.