题目描述
立方体有 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; }