天天看點

hdu1418抱歉(歐拉公式)抱歉

抱歉

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 4801    Accepted Submission(s): 2133

Problem Description 非常抱歉,本來興沖沖地搞一場練習賽,由于我準備不足,出現很多資料的錯誤,現在這裡換一個簡單的題目:

前幾天在網上查找ACM資料的時候,看到一個中學的奧數題目,就是不相交的曲線段分割平面的問題,我已經發到論壇,并且lxj 已經得到一個結論,這裡就不

多講了,下面有一個類似的并且更簡單的問題:

如果平面上有n個點,并且每個點至少有2條曲線段和它相連,就是說,每條曲線都是封閉的,同時,我們規定:

1)所有的曲線段都不相交;

2)但是任意兩點之間可以有多條曲線段。

如果我們知道這些線段把平面分割成了m份,你能知道一共有多少條曲線段嗎?

Input 輸入資料包含n和m,n=0,m=0表示輸入的結束,不做處理。

所有輸入資料都在32位整數範圍内。  

Output 輸出對應的線段數目。  

Sample Input

3 2
0 0
        

Sample Output

3
        

 這題很水,但是我不會做= =  看了discuss才知道歐拉公式,然後惡補了下歐拉公式,給大家分享一下。

歐拉公式有4條

(1)分式:

a^r/(a-b)(a-c)+b^r/(b-c)(b-a)+c^r/(c-a)(c-b)

當r=0,1時式子的值為0

當r=2時值為1

當r=3時值為a+b+c

(2)複數

由e^iθ=cosθ+isinθ,得到:

sinθ=(e^iθ-e^-iθ)/2i

cosθ=(e^iθ+e^-iθ)/2

此函數将兩種截然不同的函數---指數函數與三角函數聯系起來,被譽為數學中的“天橋”.

當θ=π時,成為e^iπ+1=0 它把數學中最重要的e、i、π、1、0聯系起來了.

(3)三角形

設R為三角形外接圓半徑,r為内切圓半徑,d為外心到内心的距離,則:

d^2=R^2-2Rr

(4)多面體

設v為頂點數,e為棱數,f是面數,則

v-e+f=2-2p

p為虧格,2-2p為歐拉示性數,例如

p=0 的多面體叫第零類多面體

p=1 的多面體叫第一類多面體

在多面體中的運用:

簡單多面體的頂點數v、面數f及棱數e間有關系

v+f-e=2

(5)初等數論裡的歐拉公式:

  歐拉φ函數:φ(n)是所有小于n的正整數裡,和n互素的整數的個數。n是一個正整數。

  歐拉證明了下面這個式子:

  如果n的标準素因子分解式是p1^a1*p2^a2*……*pm^am,其中衆pj(j=1,2,……,m)都是素數,而且兩兩不等。則有

  φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm)

  利用容斥原理可以證明它。

等等

(1)式很好證明,通過化簡即可得證,這裡不給出證明了。 (2)式不怎麼會用,畢竟複數了解得比較少,隻能死記下公式了。。。 (3)(4)式經常用于計算幾何。

這個題與(4)相似,但不完全一緻,因為(4)式是立體多面體的公式,但我們可以将此題的平面結構推出立體的形态,由于線段是不相交的,是以我們可以考慮成将它沿着這條線對折,成為一個多面體,這樣,多加的一條線段,相當于邊數+1,這樣,面數和頂點數已經給你,讓你找棱數。套套公式,即可解掉此題。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<stack>
#include<queue>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#define eps 1e-8
#define zero(x) (((x>0?(x):-(x))-eps)
#define mem(a,b) memset(a,b,sizeof(a))
#define memmax(a) memset(a,0x3f,sizeof(a))
#define pfn printf("\n")
#define ll __int64
#define ull unsigned long long
#define sf(a) scanf("%d",&a)
#define sf64(a) scanf("%I64d",&a)
#define sf264(a,b) scanf("%I64d%I64d",&a,&b)
#define sf364(a,b,c) scanf("%I64d%I64d%I64d",&a,&b,&c)
#define sf2(a,b) scanf("%d%d",&a,&b)
#define sf3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define sf4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d)
#define sff(a) scanf("%f",&a)
#define sfs(a) scanf("%s",a)
#define sfs2(a,b) scanf("%s%s",a,b)
#define sfs3(a,b,c) scanf("%s%s%s",a,b,c)
#define sfd(a) scanf("%lf",&a)
#define sfd2(a,b) scanf("%lf%lf",&a,&b)
#define sfd3(a,b,c) scanf("%lf%lf%lf",&a,&b,&c)
#define sfd4(a,b,c,d) scanf("%lf%lf%lf%lf",&a,&b,&c,&d)
#define sfc(a) scanf("%c",&a)
#define ull unsigned long long
#define debug printf("***\n")
const double PI = acos(-1.0);
const double e = exp(1.0);
const int INF = 0x7fffffff;;
template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
template<class T> inline T Min(T a, T b) { return a < b ? a : b; }
template<class T> inline T Max(T a, T b) { return a > b ? a : b; }
bool cmpbig(int a, int b){ return a>b; }
bool cmpsmall(int a, int b){ return a<b; }
using namespace std;
int main()
{
  //  freopen("data.in","r",stdin);
    ll n,m;
    while(~sf264(n,m)&&(n||m))
    {
        ll ans=n+m-2;
        printf("%I64d\n",ans);
    }
    return 0;
}