题目描述
立方体有 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,表示游戏要进行的轮数。
输出格式:
如果答案是整数,则答案共一行包含一个整数;如果答案是分数,则答案共一行包含一个最简分
式(无空格)。
输入输出样例
0 0 4 0 0 0 2
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 1234cin >> 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\n",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;}}elseif (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;}}elseif (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;elsecout << e[3].a << '/' << e[3].b << endl;return 0; }