【qscoj】伊苏比的梦幻之旅之魔方(枚举+公式+高精度)
2017-05-19 21:06
155 查看
描述
timg.jpg
刘老师很喜欢玩魔方。平均速度二阶20秒,三阶1分钟,四阶3分30秒,五阶8分钟。一个N阶魔方由N*N*N个小方块构成,而这些小方块又分为中心块、棱块和角块三部分,中心块为只有1面朝外的小方块,棱块为2面朝外的小方块,角块为3面朝外的小方块。请你帮刘老师统计,一个N阶魔方,共有多少个中心块、棱块和角块呢?
输入
一个整数N.
输出
共三行,分别输出N阶魔方的中心块数、棱块数和角块数。
样例输入1
3
样例输出1
6
12
8
小数据范围:2≤N≤5
中数据范围:2≤N≤10^9
大数据范围:2≤N≤10^5109
A(小数据) :
A(中数据) :
A(大数据) :
数据范围很大时,需要考虑高精度运算了。
timg.jpg
刘老师很喜欢玩魔方。平均速度二阶20秒,三阶1分钟,四阶3分30秒,五阶8分钟。一个N阶魔方由N*N*N个小方块构成,而这些小方块又分为中心块、棱块和角块三部分,中心块为只有1面朝外的小方块,棱块为2面朝外的小方块,角块为3面朝外的小方块。请你帮刘老师统计,一个N阶魔方,共有多少个中心块、棱块和角块呢?
输入
一个整数N.
输出
共三行,分别输出N阶魔方的中心块数、棱块数和角块数。
样例输入1
3
样例输出1
6
12
8
小数据范围:2≤N≤5
中数据范围:2≤N≤10^9
大数据范围:2≤N≤10^5109
A(小数据) :
#include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; // 也可暴力枚举不多的所有情况 int x = (n-2) * (n-2) * 6; int y = 12 * (n - 2); int z = 8; cout << x << endl; cout << y << endl; cout << z << endl; return 0; }
A(中数据) :
#include<bits/stdc++.h> using namespace std; int main() { long long n; cin >> n; long long x = (n-2) * (n-2) * 6; //范围超了int,在long long 内 long long y = 12 * n - 24; long long z = 8; cout << x << endl; cout << y << endl; cout << z << endl; return 0; }
A(大数据) :
#include<bits/stdc++.h> using namespace std; int a[12000],b[12000],z[12000],l[12000]; //位数 int main() { string s; // 大数以字符串形式读入 cin >> s; int len = s.length(); bool flag; for (int i = 0;i < len; ++i) { // 字符反转,从最后一位操作数开始 a[i] = s[len-1-i] - 48; b[i] = a[i]; } b[0]-=2; // n-2 int j = 0; while (b[j] < 0) { // 处理个位为0,1的情况,十位减1来补,以此往前类推 b[j] += 10; ++j; --b[j]; } for (int i = 0; i < len; ++i) { l[i] = b[i] *12; // 逐位相乘12 12 * (n-2) } for (int i = 0; i < len + 2; ++i) { // 乘数为12,位数增加不多于2位 +2 j = l[i] / 10; l[i] %= 10; l[i+1] += j; // 进位 } for (int i = 0; i < len; ++i) { for(int j=0; j < len; ++j) { z[i+j] += b[i] * b[j]; // (n-2) * (n-2) } } for (int i=0; i < 2*len; ++i) { z[i] *= 6; //6 * (n-2) * (n-2) } for (int i = 0; i < 2*len; ++i) { j = z[i] / 10; z[i] %= 10; z[i+1] += j; } flag = 0; for (int i = 11111; i >= 0; --i) { // 取大于可能长度的数,个位下标为0,反着输入的时候从头输出 if (i == 0 || z[i]) flag = 1; //前导0不输出,从一个很高的位找到一个不为0的数开始输出,后面的数包括是0都要输出 if (flag) printf("%d", z[i]); } printf("\n"); flag = 0; for(int i = 11111; i >= 0; --i) { if (i==0 || l[i]) flag = 1; if (flag) printf("%d", l[i]); } printf("\n"); cout << "8" << endl; return 0; }
数据范围很大时,需要考虑高精度运算了。
相关文章推荐
- 【qscoj】伊苏比的梦幻之旅之教练(直接+特殊+字符串)
- 忆龙2009:先睹为快,梦幻魔方即将免费发布
- 忆龙2009:先睹为快,梦幻魔方即将免费发布
- 忆龙2009:梦幻魔方V1.2.1.1正式发布
- 忆龙2009:梦幻魔方新版本发布
- Tyvj 1231 跳格子I (数学,欧拉函数)(高精度)
- java使用BigDecimal 处理商业精度及高精度详解
- 模板之高精度
- 高精度计算模板——棋盘覆盖问题
- BZOJ1483: [HNOI2009]梦幻布丁
- Java做高精度计算(BigDecimal类)
- poj 1001 Exponentiation(高精度运算)
- 高精度除法(大数除int型)模板
- Windows高精度时间
- 只要7步,就能将任何魔方6面还原
- C语言 · 高精度加法
- 基础练习 高精度加法
- 超宽带(UWB)室内高精度定位技术引领睿智时代
- C语言 · 高精度乘法
- codevs 高精度加法 3116