hdu 5047平面分割

2021-06-26 18:08:24 字數 905 閱讀 8174

題目大意:

給n條樣子像「m」的折線,求它們能把二維平面分成的面最多是多少。

解題思路:

我們發現直線1條:2平面;2直線:4平面;3直線:7平面......因為第n條直線要與前面n-1條直線都相交,才能使分的平面最多,則新增第n條直線,平面增加n個;

所以公式是面f = 2 + 2 + 3 + ......+ n = (1+n)*n/2 + 1

因為題目的是「m」的折線,乙個「m」有4條線將平面分成2塊,4條直線將平面分成11塊,它們之間相差9塊; 當兩個「m」,平面分成19塊,8條直線,平面分成37塊,相差18,

給n個「m」,公式f = (1+4*n)*4*n/2+1-n*9 = n*(8*n-7)+1

因為n最大是10^12,__int64(long long)都是9*10^18,n*n就會資料溢位。開始的時候沒有計算時間複雜度,就用普通的大數運算,結果超時。後來師兄說大數有優化,

就是將乙個大數分成左右兩部分,分別用__int64 存。

因為防止兩個數相乘資料溢位,所以我的數右半部分是9位數。舉個例子 2100123456789,ans1=2100,ans0=123456789;

因為這個大數這樣分,最多兩部分所以推到公式如下

/***********************

* author:fisty

* data:2014-11-2

* hdu5047

* ******************/

#include #include using namespace std;

typedef long long ll;

#define mod 1000000000

int main()else

}return 0;

}

hdu 5047 大數 平面區域劃分公式

首先吐槽一下,這道題的時間卡得真是醉了.首先見到這個問題,我們應該先想到直線的平面劃分公式,f n 1 n n 1 2 如何理解這個公式呢 有一條直線時,將乙個平面區域劃分為兩塊,之後每在加一條直線,獲得最大劃分區域的方法就是讓每條直線兩兩相交且不重合.如果當前直線是第i條,那麼它可以和之前的i 1...

HDU 5047 推公式 別樣輸出

題意 給n個 m 形,問最多能把平面分成多少區域 解法 推公式 f n 4n 4n 1 2 9n 1 8n 1 n 1 2 前面部分有可能超long long,所以要轉化一下,令a 8n 1,b n 1,將兩個數都化為a1 10 8 b1的形式,則 a1 10 8 b1 a2 10 8 b2 a1a...

hdu 5047 大數找規律

找規律信kuangbin,能ac include include include include include include include include include include include include using namespace std 完全大數模板 輸出cin a 輸出...