標籤: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