HDOJ 3547 DIY Cube 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3547

题目大意:求用$C$种颜色给立方体的8个顶点染色的本质不同的方法。两种方法本质不同即不能通过旋转立方体使得两个立方体的染色情况一致。

简要题解:首先可以得到有24种组合旋转方式。根据Polya定理以及群论中的拉格朗日定理,然后再自己多想一想,就可以得到:$Ans=\frac{x^8+Ax^4+Bx^2+Cx}{24}$,可知有3个未知数,然后样例正好有3组数据,所以可以解方程解得$A=17,B=6,C=0$。注意第三个数据是模了$10^{15}$次方的,但是显然$112^4$的四次方并不会超过$10^{15}$,所以也可以拿来使用。最后直接高精度就可以了。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5 #define K 10
  6 #define D 15
  7
  8 const int T[5] = {0, 0, 6, 17, 1};
  9 int Case, n;
 10
 11 struct Big
 12 {
 13     int len, num[101];
 14     Big () {len = 0; memset(num, 0, sizeof(num));}
 15     void init(int k)
 16     {
 17         len = 0;
 18         memset(num, 0, sizeof(num));
 19         for (; k; k /= K)
 20             num[++ len] = k % K;
 21         len = max(len, 1);
 22     }
 23     void Add(Big a)
 24     {
 25         len = max(len, a.len);
 26         for (int i = 1; i <= len; i ++)
 27             num[i] += a.num[i];
 28         for (int i = 1; i < len; i ++)
 29             if (num[i] >= K)
 30             {
 31                 num[i + 1] ++;
 32                 num[i] -= K;
 33             }
 34         if (num[len] >= K)
 35         {
 36             num[len + 1] = 1;
 37             num[len ++] -= K;
 38         }
 39     }
 40     void Times(Big a)
 41     {
 42         Big b;
 43         b.len = len + a.len - 1;
 44         for (int i = 1; i <= len; i ++)
 45             for (int j = 1; j <= a.len; j ++)
 46                 b.num[i + j - 1] += num[i] * a.num[j];
 47         for (int i = 1; i < b.len; i ++)
 48             if (b.num[i] >= K)
 49             {
 50                 b.num[i + 1] += b.num[i] / K;
 51                 b.num[i] %= K;
 52             }
 53         while (b.num[b.len] >= K)
 54         {
 55             b.num[b.len + 1] += b.num[b.len] / K;
 56             b.num[b.len ++] %= K;
 57         }
 58         len = b.len;
 59         for (int i = 1; i <= len; i ++)
 60             num[i] = b.num[i];
 61     }
 62     void Multi(int k)
 63     {
 64         for (int i = 1; i <= len; i ++)
 65             num[i] *= k;
 66         for (int i = 1; i < len; i ++)
 67             if (num[i] >= K)
 68             {
 69                 num[i + 1] += num[i] / K;
 70                 num[i] %= K;
 71             }
 72         while (num[len] >= K)
 73         {
 74             num[len + 1] += num[len] / K;
 75             num[len ++] %= K;
 76         }
 77     }
 78     void Divide(int k)
 79     {
 80         for (int i = len; i >= 1; i --)
 81         {
 82             if (i > 1) num[i - 1] += (num[i] % k) * K;
 83             num[i] /= k;
 84         }
 85         for (; !num[len] && len > 1; len --) ;
 86     }
 87     void out()
 88     {
 89         for (int i = min(D, len); i; i --)
 90             printf("%d", num[i]);
 91         puts("");
 92     }
 93 }A[5], Ans;
 94
 95 int main()
 96 {
 97     scanf("%d", &Case);
 98     for (int Test = 1; Test <= Case; Test ++)
 99     {
100         scanf("%d", &n);
101         A[1].init(n), Ans.init(0);
102         for (int i = 2; i <= 4; i ++)
103         {
104             A[i] = A[i - 1];
105             A[i].Times(A[i - 1]);
106             A[i].Multi(T[i]);
107             Ans.Add(A[i]);
108             A[i].Divide(T[i]);
109         }
110         Ans.Divide(24);
111         printf("Case %d: ", Test);
112         Ans.out();
113     }
114     return 0;
115 }

HDOJ 3547

  1 #include <cstdio>
  2 typedef long long LL;
  3 #define Mod 10000000000000000LL
  4
  5 const int Base[4] = {0, 1, 2, 112};
  6 const LL Ans[4] = {0LL, 23LL, 296LL, 2675058176LL};
  7
  8 struct Frac
  9 {
 10     LL fz, fm;
 11     Frac (LL _fz = 0LL, LL _fm = 0LL) {fz = _fz, fm = _fm;}
 12     LL Abs(LL x)
 13     {
 14         return x > 0 ? x : -x;
 15     }
 16     LL gcd(LL x, LL y)
 17     {
 18         return !y ? x : gcd(y, x % y);
 19     }
 20     void Simplify()
 21     {
 22         LL d = gcd(Abs(fz), Abs(fm));
 23         fz /= d, fm /= d;
 24         if (fm < 0) fm = -fm, fz = -fz;
 25     }
 26     Frac operator + (const Frac a)
 27     {
 28         Frac b;
 29         b.fz = fz * a.fm + fm * a.fz;
 30         b.fm = fm * a.fm;
 31         b.Simplify();
 32         return b;
 33     }
 34     Frac operator - (const Frac a)
 35     {
 36         Frac b;
 37         b.fz = fz * a.fm - fm * a.fz;
 38         b.fm = fm * a.fm;
 39         b.Simplify();
 40         return b;
 41     }
 42     Frac operator * (const Frac a)
 43     {
 44         Frac b;
 45         b.fz = fz * a.fz;
 46         b.fm = fm * a.fm;
 47         b.Simplify();
 48         return b;
 49     }
 50     Frac operator / (const Frac a)
 51     {
 52         Frac b;
 53         b.fz = fz * a.fm;
 54         b.fm = fm * a.fz;
 55         b.Simplify();
 56         return b;
 57     }
 58     void out()
 59     {
 60         printf("%lld/%lld\n", fz, fm);
 61     }
 62 }X[5][5], Y[5];
 63
 64 inline void Gauss()
 65 {
 66     for (int i = 1; i < 3; i ++)
 67         for (int j = i + 1; j <= 3; j ++)
 68         {
 69             Frac t = X[j][i] / X[i][i];
 70             for (int k = i; k <= 3; k ++)
 71                 X[j][k] = X[j][k] - X[i][k] * t;
 72             Y[j] = Y[j] - Y[i] * t;
 73         }
 74     for (int i = 3; i; i --)
 75     {
 76         Frac sum;
 77         sum.fz = 0LL, sum.fm = 1LL;
 78         for (int j = i + 1; j <= 3; j ++)
 79             sum = sum + X[i][j] * Y[j];
 80         Y[i] = (Y[i] - sum) / X[i][i];
 81     }
 82 }
 83
 84 int main()
 85 {
 86     for (int i = 1; i <= 3; i ++)
 87     {
 88         for (int j = 3; j; j --)
 89         {
 90             if (j == 3) X[i][j].fz = Base[i];
 91                 else X[i][j].fz = X[i][j + 1].fz * X[i][j + 1].fz;
 92             X[i][j].fm = 1LL;
 93         }
 94         Y[i].fz = Ans[i], Y[i].fm = 1LL;
 95     }
 96     Gauss();
 97     for (int i = 1; i <= 3; i ++)
 98         Y[i].out();
 99     return 0;
100 }

HDOJ 3547 (Gauss)

时间: 2024-10-14 09:01:03

HDOJ 3547 DIY Cube 解题报告的相关文章

hdu 3547 DIY Cube (Ploya定理)

DIY Cube Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 584    Accepted Submission(s): 284 Problem Description Mr. D is interesting in combinatorial enumeration. Now he want to find out the nu

最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)

首先POJ题目: 链接:1251 Jungle Roads 题目大意:纯求最小生成树,结果为最小权值边的和.采用邻接表 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 7 #define maxn 30 //最大顶点个数 8 int n; //顶点数,边数 9 10 struct arcn

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的

ACdream 1203 - KIDx&#39;s Triangle(解题报告)

KIDx's Triangle Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description One day, KIDx solved a math problem for middle students in seconds! And than he created this problem. N

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.