10601 - Cubes(Ploya)

2024-06-01 20:18
文章标签 cubes ploya 10601

本文主要是介绍10601 - Cubes(Ploya),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UVA 10601 - Cubes

题目链接

题意:给定正方体12条棱的颜色,要求用这些棱能组成多少不同的正方体

思路:利用ploya定理去求解,分类讨论,正方体一共24种旋转,对应的旋转方式有4种:
1、不动
2、沿两面中点连线旋转
3、沿对顶点连线旋转
4、沿两棱中点连线旋转

简单推算出每种情况对应的循环组数,在加上组合数学去进行选择颜色求解,注意第4种情况中,有两条棱和其他的循环长度是不同的,可以枚举然后扣掉讨论。

代码:

#include <stdio.h>
#include <string.h>int t, color[6], save[6], c[13][13];long long solve(int k) {long long sum = 0, ans = 1;for (int i = 0; i < 6; i++) {if (save[i] % k) return 0;save[i] /= k;sum += save[i];}for (int i = 0; i < 6; i++) {ans *= c[sum][save[i]];sum -= save[i];}return ans;
}long long solve1() {memcpy(save, color, sizeof(save));return solve(1);
}long long solve2() {memcpy(save, color, sizeof(save));long long ans = 6 * solve(4);memcpy(save, color, sizeof(save));return ans + 3 * solve(2);
}long long solve3() {memcpy(save, color, sizeof(save));return 8 * solve(3);
}long long solve4() {long long ans = 0;for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {memcpy(save, color, sizeof(save));save[i]--; save[j]--;if (save[i] < 0 || save[j] < 0) continue;ans += 6 * solve(2);}	}return ans;
}int main() {for (int i = 0; i <= 12; i++) {c[i][0] = c[i][i] = 1;for (int j = 1; j < i; j++)c[i][j] = c[i - 1][j - 1] + c[i - 1][j];}scanf("%d", &t);while (t--) {int col;memset(color, 0, sizeof(color));for (int i = 0; i < 12; i++) {scanf("%d", &col);color[col - 1]++;}printf("%lld\n", (solve1() + solve2() + solve3() + solve4()) / 24);}return 0;
}


这篇关于10601 - Cubes(Ploya)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022017

相关文章

【CF】E. Anya and Cubes(双向DFS)

根据题意的话每次递归分3种情况 一共最多25个数,时间复杂度为3^25,太大了 我们可以分2次求解第一次求一半的结果,也就是25/2 = 12,记录结果 之后利用剩余的一半求结果 s-结果 = 之前记录过的结果 就可以 时间复杂度降低为 3 ^ (n/2+1) 题目链接:http://codeforces.com/contest/525/problem/E #include<set

Marching Cubes 算法再探

Marching Cubes 算法再探 基础过程代码mian.cppMarchingCubes.hMarchingCubes.cpp 之前做NeRF相关工作时简单看过,但没有深究其实现,知其然不知其所以然的程度,算是初探。 基础 为了对MC有大致了解,可以先根据Marching Cubes 算法初探,理解一下Marching Cubes这个名字的由来,其二维空间中的示例

Codeforces Round #295 (Div. 1) B. Cubes (STL+类拓扑)

最近课业繁重,这题写了两天。。昨晚睡觉的时候才突然想到了最后一点的解决方法。 不知道该不该叫做拓扑。。感觉还是挺像的。。就把标题称之为类拓扑了。。这题的方法是用map来标记状态是否存在,然后用类似拓扑的方法不断的找拿走后依然稳定的方块,我用了两个优先队列来维护,分别取最大和最小。然后就是模拟这个过程取方块了。 代码如下: #include <iostream>#include <stri

(2/3/4)-D Sqr/Rects/Cubes/Boxes?

Description Problem J (2/3/4)-D Sqr/Rects/Cubes/Boxes? Input: standard input Output: standard output Time Limit: 2 seconds       You can see a (4x4) grid below. Can you tell me how many square

marching cubes表面重建原理

Marching Cubes算法是三维离散数据场中提取等值面的经典算法,之前主要应用于医学图像重建,当前在TSDF等重建场景广泛应用。 参考论文:Marching Cubes: A High Resolution 3D Surface Construction Algorithm 参考论文: KinectFusion: real-time dynamic 3D surface reconstruc

UVA 10177 (2/3/4)-D Sqr/Rects/Cubes/Boxes

(2/3/4)-D Sqr/Rects/Cubes/Boxes? Input: standard input Output: standard output Time Limit: 2 seconds   You can see a (4x4) grid below. Can you tell me how many squares and rectangles are hidden

UVA 11255 - Necklace(Ploya)

UVA 11255 - Necklace 题目链接 题意:一个链子,由三种颜色的珠子构成,现在给定三种颜色的珠子个数,求能组成多少种(旋转,翻转算同一种) 思路:利用ploya定理,然后分类讨论即可 代码: #include <cstdio>#include <cstring>typedef long long ll;const int N = 45;int t, a

HDU 2865 Birthday Toy(ploya好题)

对于这种颜色多的,但是限制简单的情况,可以利用dp推出公式,然后矩阵快速幂求解 代码: #include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MOD = 1000000007;typedef long long ll;int n, k;int phi(int n) {

POJ 2888 Magic Bracelet(ploya)

跟POJ2154一样的思路,但是这题多了个颜色限制 构造关系矩阵,每次有i个循环节,就做i次矩阵乘法,得到的就是每个颜色经过i步能回到自身的情况数,利用矩阵快速幂就可以快速计算了 代码: #include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MOD = 9973;in

POJ 2154 Color (ploya欧拉函数)

ploya定理,然后公式利用欧拉函数优化,gcd必然是因子,这样只要枚举因子,每个因子利用欧拉函数计算出现次数 代码: #include <cstdio>#include <cstring>#include <algorithm>using namespace std;int t, n, p;int pow_mod(int x, int k) {x %= p;int ans = 1;