HDU 5047 Sawtooth(大數類比)上海賽區網賽1006

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   for   sp   

題目連結: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 Big10 {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

 

HDU 5047 Sawtooth(大數類比)上海賽區網賽1006

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.