常州模拟赛d4t1 立方体

题目描述

立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草。为了训练奶牛的合作精神,它

们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛。

游戏开始,给定每个面上奶牛的干草数量,k 轮游戏后,请问奶牛 Shary 拥有的干草数量是多

少? 奶牛在立方体上编号次序是:前、后、上、下、左、右,奶牛 Shary 在立方体的上面。

如果答案是整数,直接输出;答案可能是分数,用最简分式表示,格式为 X/Y。

例如:一开始 6 个奶牛的干草数量是:0,0,4,0,0,0。Shary 开始有干草数量是 4,其他奶

牛没有。游戏一轮以后,各个奶牛的干草数为:1,1,0,0,1,1;二轮以后各个奶牛的干草数为:

1/2,1/2,1,1,1/2,1/2。

输入输出格式

输入格式:

第一行包含 6 个整数 A i ,表示 6 只奶牛开始时拥有的干草数量。

第二行包含 1 个整数 k,表示游戏要进行的轮数。

输出格式:

如果答案是整数,则答案共一行包含一个整数;如果答案是分数,则答案共一行包含一个最简分

式(无空格)。

输入输出样例

输入样例#1:
0 0 4 0 0 0
2
输出样例#1:
1

说明

对于 30% 的数据:保证任意时刻每只奶牛拥有的干草数量为整数;

对于 100% 的数据:0 ≤ A i ≤ 1000,0 ≤ k ≤ 45。

分析:一道大模拟,就是分数加减法,不过要注意每次运算完都必须要约分,而且求最小公倍数要先除后乘,否则会爆long long.

#include <bits/stdc++.h>

using namespace std;

int k; 

long long gcd(long long x,long long y)
{
    if (!y)
    return x;
    return gcd(y,x % y);
}

struct node
{
   long long a,b;    
}e[10];

struct node2
{
    long long a,b;
}e2[10];

node add(node2 x,node y)
{
    long long temp = gcd(x.b,y.b);
    long long lcm = x.b / temp * y.b;
    x.a *= (lcm / x.b);
    y.a *= (lcm / y.b);
    node tt;
    tt.a = x.a + y.a;
    tt.b = lcm;
    if (tt.a != 0)
    {
    long long t = gcd(tt.a,tt.b);
    tt.a /= t;
    tt.b /= t;
    }
    
    return tt;
}

int main()
{
    //前 --- 上下左右  1  3456
    //后 --- 上下左右  2  3456
    //上 --- 前后左右  3  1256
    //下 --- 前后左右  4  1256
    //左 --- 上下前后  5  1234
    //右 --- 上下前后  6  1234
    cin >> e[1].a >> e[2].a >> e[3].a >> e[4].a >> e[5].a >> e[6].a >> k;
    for (int i = 1; i <= 6; i++)
    e[i].b = 1;
    while (k--)
    {
        for (int i = 1; i <= 6; i++)
        {
            e2[i].a = e[i].a;
            e2[i].b = e[i].b;
            e2[i].b *= 4;
            e[i].a = 0;
            e[i].b = 1;
            //printf("%d %d
",e2[i].a,e2[i].b);
            if (e2[i].a != 0)
            {
            int t = gcd(e2[i].a,e2[i].b);
            e2[i].a /= t;
            e2[i].b /= t;
        }
        }
        for (int i = 1; i <= 6; i++)
        {
            if (i == 1 || i == 2)
            {
                for (int j = 3; j <= 6; j++)
                {
                    node t = add(e2[i],e[j]);
                    e[j].a = t.a;
                    e[j].b = t.b;
                }
            }
            else
            if (i == 3 || i == 4)
            {
                for (int j = 1; j <= 2; j++)
                {
                    node t = add(e2[i],e[j]);
                    e[j].a = t.a;
                    e[j].b = t.b;
                }
                for (int j = 5; j <= 6; j++)
                {
                    node t = add(e2[i],e[j]);
                    e[j].a = t.a;
                    e[j].b = t.b;
                }
            }
            else
            if (i == 5 || i == 6)
            {
                for (int j = 1; j <= 4; j++)
                {
                    node t = add(e2[i],e[j]);
                    e[j].a = t.a;
                    e[j].b = t.b;
                }
            }
        }
    }
    if (e[3].a % e[3].b == 0)
    cout << e[3].a / e[3].b << endl;
    else
    cout << e[3].a << '/' << e[3].b << endl;
    
    return 0;
}
原文地址:https://www.cnblogs.com/zbtrs/p/7424775.html