zoukankan      html  css  js  c++  java
  • HDU 5047 Sawtooth(大数模拟)上海赛区网赛1006

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

    解题报告:问一个“M”型可以把一个矩形的平面最多分割成多少块。

    输入是有n个“M",现在已经推出这个公式应该是8 * n^2 - 7 * n + 1,但是这个n的范围达到了10^12次方,只要平方一次就超出long long  的范围了,怎么办呢,用大数?

    都试过了,很奇怪,会超时,按照估算的话感觉不会,可能是中间结果比较大吧,这个还在思考,但是10^12平方一次乘以八也只达到了10^25次方级别,所以我们可以用四个__int64来模拟这个结果,这样计算起来就快多了。每一个只存结果的相应的八位,为什么只存八位呢,因为中间要进行平方运算,8位平方以下还好,在long long 的承受范围之内,如果大一点超过long long 就不行了,中间计算的时候相乘就容易溢出,而八位也刚好方便计算。相乘的时候要将大数的对应的位上的long long 两两进行相乘。

    还有最后输出结果要注意一点,不能直接输出,中间的数前导0也要输出来,不然看起来就好像少了几个0,反正中间结果用8位的固定格式输出就行了。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<cstdlib>
     7 using namespace std;
     8 typedef __int64 INT;
     9 struct Big
    10 {
    11     INT d[4];
    12     Big()
    13     {
    14         memset(d,0,sizeof(d));
    15     }
    16     void print()
    17     {
    18         int flag = 0;
    19         for(int i = 3;i >= 0;--i)
    20         if(d[i] != 0 && !flag)
    21         {
    22             printf("%I64d",d[i]);
    23             flag = 1;
    24         }
    25         else if(flag) printf("%08I64d",d[i]);
    26         puts("");
    27     }
    28 };
    29 Big operator * (Big a,Big b)
    30 {
    31     Big c;
    32     INT flag = 0;
    33     for(int i = 0;i < 4;++i)
    34     for(int j = 0;j < 4;++j)
    35     {
    36         INT temp = a.d[i] * b.d[j] + flag;
    37         if(temp) c.d[i+j] += temp % 100000000;
    38         flag = temp / 100000000;
    39     }
    40     return c;
    41 }
    42 Big operator - (Big a,Big b)
    43 {
    44     Big c;
    45     for(int i = 0;i < 4;++i)
    46     {
    47         if(a.d[i] < b.d[i])
    48         {
    49             a.d[i+1] -= 1;
    50             a.d[i] += 100000000;
    51         }
    52         c.d[i] = a.d[i] - b.d[i];
    53     }
    54     return c;
    55 }
    56 Big operator + (Big a,Big b)
    57 {
    58     Big c;
    59     INT flag = 0;
    60     for(int i = 0;i < 4;++i)
    61     {
    62         INT temp = a.d[i] + b.d[i] + flag;
    63         c.d[i] = temp % 100000000;
    64         flag = temp / 100000000;
    65     }
    66     return c;
    67 }
    68 Big valueof(INT x)
    69 {
    70     int f = 0;
    71     Big ans;
    72     while(x)
    73     {
    74         ans.d[f++] = x % 100000000;
    75         x /= 100000000;
    76     }
    77     return ans;
    78 }
    79 int main()
    80 {
    81     int T,kase = 1;
    82     INT a;
    83     scanf("%d",&T);
    84     while(T--)
    85     {
    86         scanf("%I64d",&a);
    87         Big ans = valueof(a) * valueof(a);
    88         ans = ans * valueof(8);
    89         ans = ans - (valueof(a) * valueof(7));
    90         ans = ans + valueof(1);
    91         printf("Case #%d: ",kase++);
    92         ans.print();
    93     }
    94     return 0;
    95 }
    View Code
  • 相关阅读:
    Java(八)——面向对象(4)-抽象类与接口
    Java(七)——面向对象(3)-多态
    Java(六)——面向对象(2)-继承
    Java(五)——面向对象(1)-基础
    Java(四)——数组
    Java(三)——流程控制
    Java(二)——Java基础
    易忘小技巧--yum
    网络测速命令--speedtest
    大型网站架构技术读后感
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/4004189.html
Copyright © 2011-2022 走看看