青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Fourth Dimension Space

枯葉北風(fēng)寒,忽然年以殘,念往昔,語(yǔ)默心酸。二十光陰無(wú)一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢(mèng)令

#

積性函數(shù)的一些證明(轉(zhuǎn))

在數(shù)論中的積性函數(shù)。對(duì)于正整數(shù)n的一個(gè)算術(shù)函數(shù)f(n),當(dāng)中f(1)=1且當(dāng)a,b互質(zhì),f(ab)=f(a)f(b),在數(shù)論上就稱它為積性函數(shù)。

證明: f(n) = ∑g(d)^3 (d | n, g(d)表示d的約數(shù)個(gè)數(shù))

求證: f(n) 是積性函數(shù),即f(1) = 1, f(ab) = f(a) * f(b); a,b互質(zhì)

(1)f(1) = g(1)^3 = 1 ^ 3 = 1

(2)f(n) = f(a) * f(b);

f(n) = ∑g(d)^3 (d | n, g(d)表示d的約數(shù)個(gè)數(shù))

f(a) = ∑g(p)^3 (d | a, g(p)表示p的約數(shù)個(gè)數(shù))

f(b) = ∑g(q)^3 (d | b, g(q)表示q的約數(shù)個(gè)數(shù))

證明f(n) = f(a) * f(b)即證明∑g(d)^3  = ∑g(p)^3 * ∑g(q)^3

假設(shè) d = p * q; //d為n中的某個(gè)約數(shù),p為a中的某個(gè)約數(shù),q為b中某個(gè)約數(shù),總存在d = p * q

現(xiàn)需證明g(d)^3 = g(p)^3 * g(q)^3;

g(p)^3 * g(q)^3 = (g(p) * g(q)) ^ 3

////////////////////////////////////////////

將d質(zhì)因數(shù)分解: d = p1^a1 * p2^a2 ……pj^aj

將p質(zhì)因數(shù)分解: p = p1^b1 * p2^b2 ……pj^bj

將q質(zhì)因數(shù)分解: q = p1^c1 * p2^c2 ……pj^cj

其中a1 = b1 + c1 , a2 = b2 + c2,…… aj = bj + cj;

因?yàn)閜,q互質(zhì),所以ai = bi + ci中要么(bi == ai && ci == 0) ||  (ci == ai && bi == 0)這兩種情況

g(d) = (a1 + 1) * (a2 + 1) * ……*(aj + 1);

g(p) = (b1 + 1) * (b2 + 1) * ……*(bj + 1);

g(q) = (c1 + 1) * (c2 + 1) * ……*(cj + 1);

所以g(d) = g(p) * g(q);

==> g(d)^3 = g(p)^3 * g(q)^3;

==> ∑g(d)^3  = ∑g(p)^3 * ∑g(q)^3

==> f(n) = f(a) * f(b)

從而得證f(n)是積性函數(shù)

f(n) = f(p1^a1) * f(p2 ^ a2) * f(p3 ^ a3) …… * f(pj^aj);

f(p1^a1) = ∑g(d)^3 (d | p1 ^ 3) 由p1是質(zhì)因數(shù)

所以d的取值為p1^0, p1 ^ 1, p1^2, ……,p1^a1

g(p1^i) = i + 1;

故f(p1^a1) = (0 + 1) ^ 3 + (1 + 1) ^ 3 + …… + (a1 + 1) ^ 3 = (a1 + 1)^2 * (a1 + 2)^2 / 4;

以此類推,

所以最終f(n) = f(p1 ^ a1) * f(p2 ^ a2) * …… * f(pj ^ aj)

            = ((a1 + 1)^2 * (a1 + 2) ^2 / 4) * ((a2 + 1)^2 * (a2 + 2)^2 / 4) * …… *

                ((aj + 1)^2 * (aj + 2)^2 / 4);

將n質(zhì)因數(shù)分解后進(jìn)行統(tǒng)計(jì)即可。(本人代碼效率不行,如果誰(shuí)有更有效率的代碼麻煩給我一個(gè),讓我學(xué)習(xí)學(xué)習(xí))。

////////////////////////////////////////////////////////////////


轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_5c95cb070100ej4c.html

posted @ 2009-11-02 18:30 abilitytao 閱讀(528) | 評(píng)論 (0)編輯 收藏

POJ 3219 二項(xiàng)式系數(shù)(數(shù)論,簡(jiǎn)單)

之所以要寫(xiě)個(gè)解題報(bào)告,不是因?yàn)檫@道題很難,而是因?yàn)橐谎劬尤粵](méi)看出來(lái)是統(tǒng)計(jì)質(zhì)因數(shù)2出現(xiàn)的次數(shù),太nc了,為了把公式記得牢一點(diǎn),遂寫(xiě)此文~

題目意思很簡(jiǎn)單,就是讓你求組合數(shù)C(n,k)是奇數(shù)還是偶數(shù)。
C(1, 0) = C(1, 1) = 1;
C(n, 0) = 1對(duì)于所有n > 0;
C(n, k) = C(n − 1, k − 1) + C(n − 1, k)對(duì)于所有0 < kn
對(duì)于上述描述,可以直接無(wú)視之。。。

由于組合數(shù)C(n,k)=         n!
                                    ---------
                                     k!(n-k)!

所以只要算出分子分母中各自包含的質(zhì)因數(shù)2的個(gè)數(shù),如果分子的大于分子,就是偶數(shù),反之則是奇數(shù)。題目太簡(jiǎn)單,不過(guò)公式很重要,代碼就不貼了。

posted @ 2009-11-01 01:43 abilitytao 閱讀(548) | 評(píng)論 (0)編輯 收藏

POJ 1150 ——The Last Non-zero Digit(數(shù)論)

題意很簡(jiǎn)單,要求你求出一個(gè)排列數(shù)P(n,m)中最后一個(gè)非0的數(shù)字.
由于n的數(shù)值巨大,想直接求出來(lái)恐怕是不可行的。
在網(wǎng)上有這樣一個(gè)英文的解題報(bào)告,由于缺少中文的資料,硬著頭皮把它看完了:-)

The first program

Consider the number N! factored into product of powers of prime numbers. It means N!=2i * 3j * 5k * 7l * ... Note, that for each N>1 the power i is greater than k. It means, that the last non-zero digit of N! is the same as the last digit of N! / (2k * 5k). Therefore we can compute the result using the equation:

(N! / (2k * 5k)) mod 10 = ((N! / (2i * 5k)) mod 10 * 2i-k mod 10) mod 10

Number i can be obtained easily - we will divide each a=1,2,...,N by 2 until the resulting number is not divisible by 2 and after each division we will add one to the variable i. Number k can be obtained in the same manner. Let f(i) denotes the number which we obtain by dividing i by the 2a * 5b where a and b are the highest numbers such that the i is divisible by this product. Number (N! / (2i * 5k)) mod 10 is equal to f(N!) mod 10 and can be computed as f(1) * f(2) * ... * f(N) mod 10. We will perform operation mod 10 after each multiplication in order to keep the resulting number as small as possible.

The advantege of this approach is that we do not need to implement arithmetics of large numbers. Some ideas used here are used in the second, more efficient program, as well.

The second program

The second program also computes the result as (2i-k mod 10 * f(N!) ) mod 10. Numbers i and k are computed much more efficiently. More precisely

i=N div 2 + (N div 2) div 2 + ((N div 2) div 2) div 2 + ...

(We get zero after finite number of divisions.) Number k can be computed in the same way. After that we can compute i-k and we need to find 2i-k mod 10. Observe, that

21 mod 10 = 2, 22 mod 10 = 4, 23 mod 10 = 8, 24 mod 10 = 6, 25 mod 10 = 2, 26 mod 10 = 4, ...

i.e. the period is 4 and we need only to compute (i-k) mod 4 and then to find corresponding last digit. This observation can help us to simplify computation of i and k - we do not need their exact values (that can be long) but we need only (i-k) mod 4.

We have shown how to compute 2i-k mod 10. Now let us consider f(N!) mod 10 = ((f(1) mod 10) * (f(2) mod 10) * ... * (f(N) mod 10)) mod 10. Note, that f(i) mod 10 is always 1,3,7 or 9. If we knew, how many 3,7,9 are among (f(1) mod 10), (f(2) mod 10), ..., (f(N) mod 10), we could compute 3a mod 10, 7b mod 10, 9c mod 10 in the similar way as we did for 2i-k (last digits of powers of 3,7,9 are also periodical).

To compute the number of 3,7,9 among (f(1) mod 10), (f(2) mod 10), ..., (f(N) mod 10) is not so easy. We will divide numbers 1,2,...,N into groups so, that in each group are numbers with same quotient i/f(i) and we will compute number of 3,7,9 among (f(i) mod 10) for each such group separatelly (there are O(N2) such groups). First, let us consider a group in which i/f(i)=1. This is the group of all numbers not divisible by 2 and 5. The number of 3,7,9 in this group is the same as number of 3,7,9 among 1 mod 10, 2 mod 10, ..., N mod 10. This number can be counted easily - it is N div 10 + a where a is 1 if the last digit of N is at least 3 (resp. at least 7 or at least 9). Now let us consider a group in which i/f(i)=L (where L=2a * 5b). We obtain this group by taking each L-th number from the sequence 1,2,3,... and dividing it by L. It means that number of 3,7,9 for this group will be the same as the number of 3,7,9 among 1 mod 10, 2 mod 10, ..., (N div L) mod 10.

Now we know everything we needed for construction of a program. Since numbers in the input file are long, we need to implement arithmetics for long numbers. However, by careful implementation we can achieve that only division of a long number by small integer is necessary.



這個(gè)題怎么來(lái)做呢?先別急,我們先來(lái)討論一下下面幾個(gè)子問(wèn)題:
1.如何求出n階乘中質(zhì)因數(shù)x(比如說(shuō)5)出現(xiàn)的次數(shù)?
比如說(shuō)15的階乘 :1*2*3*4*5*6*7*8*9*10*11*12*13*14*15
由于5這個(gè)質(zhì)因數(shù)只在5的倍數(shù)里面才出現(xiàn),所以我從5,10,15中各抽出一個(gè)5,這相當(dāng)于有15/5個(gè)質(zhì)因數(shù)5,之后5,10,15就變成了1,2,3;
由于非5的倍數(shù)顯然不在考慮范圍之內(nèi),所以我們只需繼續(xù)討論它的子問(wèn)題3!即可。
這樣,我們可以用遞歸來(lái)解決這個(gè)問(wèn)題。有了這個(gè)方法,我們是不是能夠輕易地解決n!末尾有多少個(gè)0呢?想想看...n!后0的個(gè)數(shù)是不是就和某個(gè)質(zhì)因數(shù)的個(gè)數(shù)有關(guān)呢?^_^
比如說(shuō),我們要求5出現(xiàn)的次數(shù),可以這樣寫(xiě):

int get5(int n)//計(jì)算n!中質(zhì)因子5的出現(xiàn)次數(shù)
{
    
if(n==0)
        
return 0;
    
return n/5+get5(n/5);
}


 2.如何求出n!階乘最后非0位?
比如說(shuō)我們要找10!最后非0位,由于質(zhì)因數(shù)2和5組合之后會(huì)使得末尾產(chǎn)生0.那么我們不妨把10!中2,5質(zhì)因數(shù)全部去掉,(但是請(qǐng)注意2的數(shù)目其實(shí)比5的要多,所以我們要在最后考慮多余的2對(duì)末位的影響)
如 1*2*3*4*5*6*7*8*9*10 去掉2 ,5 因子后 就是1*1*3*1*1*3*7*1*9*1,由于2,5因子已經(jīng)被去除,那么剩下的數(shù)字末尾一定是3,7,9,1中四者之一。然后我們?cè)偾蟪鲞@么一串?dāng)?shù)相乘以后末尾的數(shù)是幾.最后再補(bǔ)上2對(duì)末位的影響即可!

總結(jié)一下,求10!最后一個(gè)非0位的步驟如下:
step1:首先將10!中所有2,5因子去掉;
step2:然后求出剩下的一串?dāng)?shù)字相乘后末尾的那個(gè)數(shù)。
step3:由于去掉的2比5多,最后還要考慮多余的那部分2對(duì)結(jié)果的影響。
step4:output your answer!

正如上面文章里所說(shuō)的“To compute the number of 3,7,9 among (f(1) mod 10), (f(2) mod 10), ..., (f(N) mod 10) is not so easy”,這里面步驟2是個(gè)難點(diǎn)。如何求出剩下的這串?dāng)?shù)字相乘后最后一位是幾呢?這可以轉(zhuǎn)化成求出這些數(shù)里面末尾是3,7,9的數(shù)字出現(xiàn)的次數(shù)(為啥?因?yàn)檫@些數(shù)的n次方是有規(guī)律的,周期為4,不信你可以推一下)
好,現(xiàn)在問(wèn)題就是如何求出這串?dāng)?shù)字中末尾3,7,9各自出現(xiàn)的次數(shù)了;

一個(gè)數(shù)列實(shí)際上可以分成偶數(shù)列和奇數(shù)列,以1*2*3*4*5*6*7*8*9*10為例

分成1 3 5 7 9,   2 4 6 8 10

這樣我們嘗試分別進(jìn)行統(tǒng)計(jì),可以發(fā)現(xiàn),實(shí)際上2,4,6,8,10中的個(gè)數(shù)也就是1 2 3 4 5中的個(gè)數(shù),也就是說(shuō)我們又把這個(gè)問(wèn)題劃分成了一個(gè)原來(lái)問(wèn)題的子問(wèn)題。

f(n) = f(n/2) + g(n),g(n)表示奇數(shù)列中的數(shù)目,所以我們需要解決g(n)

再次觀察g(n)

實(shí)際上又分成了兩部分1 3 7 9 11 13 17 19 21。。。以及5的奇倍數(shù)5,15,25。。。說(shuō)明又出現(xiàn)了子問(wèn)題,如果要統(tǒng)計(jì)這個(gè)數(shù)列中末尾為x(1,3,7,9)的個(gè)數(shù)可以這樣寫(xiě):g(n,x) = n/10+(n%10 >= x)+g(n/5,x) 

這樣利用了兩個(gè)遞歸方程,我們就可以在lgn的時(shí)間內(nèi)計(jì)算出末尾為1,3,7,9的數(shù)的個(gè)數(shù)了

好了,現(xiàn)在我們得到了這串?dāng)?shù)字中末尾是3,7,9的數(shù)字的個(gè)數(shù),我們利用循環(huán)節(jié)的性質(zhì)可以快速地算出這串?dāng)?shù)字相乘后mod 10的結(jié)果,在考慮下當(dāng)時(shí)多除的2(其實(shí)也可以用循環(huán)節(jié)來(lái)處理),便可求出答案!




解決了上面兩個(gè)子問(wèn)題,我想求P(n,m)最后一個(gè)非0位就變得十分容易了。
P(n,m)實(shí)際上等于 n! / (n-m)!
我們可以求出n! 和(n-m)!中質(zhì)因數(shù)2,5,3,7,9分別出現(xiàn)的次數(shù),然后再各自相減。
然后再用循環(huán)節(jié)處理,即可!
BTW,這里還要注意一個(gè)trick,就是2的出現(xiàn)次數(shù)如果小于5,(這對(duì)于排列數(shù)來(lái)說(shuō)是可能的)我們可以直接輸出5,如果2的數(shù)目等于5,那么2的循環(huán)節(jié)不需要考慮。至于3,7,9的循環(huán)節(jié),由于這些數(shù)的4次方末位剛好是1,所以就不需要特殊考慮了。


附代碼:
#include<iostream>
#include
<cstring>
#include
<cmath>
using namespace std;

int get2(int n)//計(jì)算n!中質(zhì)因子2的出現(xiàn)次數(shù)
{
    
if(n==0)
        
return 0;
    
return n/2+get2(n/2);
}


int get5(int n)//計(jì)算n!中質(zhì)因子5的出現(xiàn)次數(shù)
{
    
if(n==0)
        
return 0;
    
return n/5+get5(n/5);
}


//////////////////////////////////////////////////////////////////////////
int g(int n,int x)//計(jì)算f(1) to f(n) 中,奇數(shù)數(shù)列中末尾為x的數(shù)出現(xiàn)的次數(shù)
{
    
if(n==0)
        
return 0;
    
return n/10+(n%10>=x)+g(n/5,x);
}


int getx(int n,int x)//計(jì)算f(1) to f(n)中,末尾為x的數(shù)的出現(xiàn)次數(shù)
{
    
if(n==0)
        
return 0;
    
return getx(n/2,x)+g(n,x);
}

//////////////////////////////////////////////////////////////////////////

int table[4][4=
{
        
6,2,4,8,//2^n%10的循環(huán)節(jié),注意如果2的個(gè)數(shù)為0時(shí)候,結(jié)果應(yīng)該是1,要特殊處理。 
        1,3,9,7,//3
        1,7,9,3,//7
        1,9,1,9,//9    
}
;//3,7,9的循環(huán)節(jié)中第一位,剛好是1,故不需要考慮這些數(shù)字出現(xiàn)次數(shù)為0的情況。


int main()
{

    
int n,m;
    
int num2;
    
int num3;
    
int num5;
    
int num7;
    
int num9;
    
while(scanf("%d%d",&n,&m)!=EOF)
    
{
        num2
=get2(n)-get2(n-m);
        num5
=get5(n)-get5(n-m);
        num3
=getx(n,3)-getx(n-m,3);
        num7
=getx(n,7)-getx(n-m,7);
        num9
=getx(n,9)-getx(n-m,9);
        
int res=1;
        
if(num5>num2)
        
{
            printf(
"5\n");
            
continue;
        }

        
else 
        
{
            
if(num2!=num5)
            
{
                res
*=table[0][(num2-num5)%4];
                res
%=10;
            }
//如果num2==num5,那么2^0次方mod 10應(yīng)該為1 ,而不是table中的6,所以要特殊處理。
            
            res
*=table[1][num3%4];
            res
%=10;
            res
*=table[2][num7%4];
            res
%=10;
            res
*=table[3][num9%4];
            res
%=10;
        }

        printf(
"%d\n",res);
    }

    
return 0;
}


                                                                                                                                                                                                         special thanks to 星星 

posted @ 2009-10-31 19:07 abilitytao 閱讀(3619) | 評(píng)論 (8)編輯 收藏

POJ 2478 Farey Sequence(歐拉函數(shù)的應(yīng)用)

這一題的關(guān)鍵在于如何快速地求出phi[n],剛開(kāi)始的時(shí)候想過(guò)打表,可是10^6個(gè)數(shù)據(jù),太大了,超代碼長(zhǎng)度。
后來(lái)借鑒了一下大牛們的算法,原來(lái)歐拉函數(shù)可以在打素?cái)?shù)表的時(shí)候求出,這樣復(fù)雜度大約為n;

這個(gè)算法的核心,基于以下這個(gè)定理:
若(N%a==0 && (N/a)%a==0) 則有:E(N)=E(N/a)*a;
若(N%a==0 && (N/a)%a!=0) 則有:E(N)=E(N/a)*(a-1);

代碼如下:
#include<cstdio>
#include
<cstring>
#include
<iostream>
using namespace std;


//基于素?cái)?shù)篩選法,計(jì)算歐拉函數(shù)phi[1] to phi[MAX],復(fù)雜度約為n,很快
//傳入三個(gè)數(shù)組:
//phi[]用于存放歐拉函數(shù)
//prime[]用來(lái)存放小于i的所有素?cái)?shù),這里其實(shí)是一個(gè)模擬堆棧
//isprime[]用來(lái)標(biāo)志該數(shù)是不是素?cái)?shù),初始值為0
////////////////////BEGEIN_TEMPLATE_BY_ABILITYTAO_ACM/////////////////////////
#define MAX 1000000
__int64 phi[MAX
+1]={0};
__int64 prime[MAX
+1]={0};
bool isprime[MAX+1]={0};
void get_phi()//這是一個(gè)基于素?cái)?shù)篩選的線性算法,很快
{
    __int64 i,j;
    __int64 len
=0;
    
for(i=2;i<=MAX;i++)
    
{
        
if(isprime[i]==false//false代表是質(zhì)數(shù)
        {
            prime[
++len]=i;
            phi[i]
=i-1;
        }

        
for(j=1;j<=len&&prime[j]*i<=MAX;j++)
        
{
            isprime[prime[j]
*i]=true;//true代表是合數(shù)
            if(i%prime[j]==0)
            
{
                phi[i
*prime[j]]=phi[i]*prime[j];  
                
break;
            }

            
else
                phi[i
*prime[j]]=phi[i]*(prime[j]-1);
        }

    }

}

/////////////////////END_TEMPLATE_BY_ABILITYTAO_ACM///////////////////////////////

__int64 s[MAX];
int main()
{
    __int64 i;
    phi[
1]=0;
    get_phi();
    
for(i=2;i<=MAX;i++)
        s[i]
=s[i-1]+phi[i];
    
while(1)
    
{
        scanf(
"%I64d",&i);
        
if(i==0break;
        printf(
"%I64d\n",s[i]);
    }

    
return 0;
}





get_phi函數(shù)中的i*prime[j]相當(dāng)于N,prime[j]相當(dāng)于a,i相當(dāng)于N/a;

posted @ 2009-10-30 13:41 abilitytao 閱讀(1681) | 評(píng)論 (0)編輯 收藏

pku 3164 最小樹(shù)形圖(Zhu-Liu Algorithm)

     摘要: 所謂的最小樹(shù)形圖,就是讓你在一個(gè)有向圖中找一個(gè)根和由根擴(kuò)展出來(lái)的一顆有向的生成樹(shù),并且使這棵樹(shù)的權(quán)值最小。令人欣喜的是,這個(gè)算法是由中國(guó)人提出來(lái)的,這也是我正式學(xué)習(xí)的第一個(gè)中國(guó)人提出來(lái)的算法^_^最小樹(shù)形圖算法(Zhu-Liu Algorithm): 1.       設(shè)最小樹(shù)形圖的總權(quán)值為cost,置cost為0。 2. ...  閱讀全文

posted @ 2009-10-29 19:38 abilitytao 閱讀(2189) | 評(píng)論 (2)編輯 收藏

TopCoder競(jìng)賽:C++, STL 用法快速入門(mén)(轉(zhuǎn))

下面總結(jié)了一些題目中常用的STL庫(kù)的用法。

 

 
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <iostream>
 
using namespace std;
 
//遞歸
int GetN(int n)
{
if (n==1) return 1;
else return GetN(n-1);
}
 
void TestSTL_main( int argc, char* argv[] )
//void main( int argc, char* argv[] )
{
/******** STL **********/
 
//string的用法
{
string s = "mmmmm";
string s2("ss22");
s2.insert(2,"kkkkk"); //把"kkkkk"插到s2的第2個(gè)位置之前(位置從0開(kāi)始)
s2+=s+"44444"+'c';
const char *pc = s.c_str();//把string轉(zhuǎn)成C-style的string,以\0終了
const char *ptr1 = s.data();;//把string轉(zhuǎn)成字符串
if (s2[2] == 'k') s2[2]='C';
s+="jkl";
s+='m';
s.push_back('\n'); //把'\n'(換行符)放在s的最后一個(gè)位置
reverse(s.begin(), s.end()); //反轉(zhuǎn)
basic_string <char>::iterator str_Iter; //遍歷
str_Iter = s.begin();
}
 
//vector的用法
{
vector<int> v;
v.push_back(8); //向v中插入元素,元素的值是8
int iLen = (int)v.size();
for(int i=0;i<iLen;i++)
{
int k = v[0]; //k==8
}
}
 
//map的用法
{
map<int, int> mp;
for(int i=0;i<3;i++)
{
mp[i]=i*2; //通過(guò)[第一個(gè)元素]來(lái)訪問(wèn)第二個(gè)元素
}
 
int total = 100;
map<int, int>::iterator it = mp.begin();
for(;it!=mp.end();it++) //遍歷mp
{
total+=it->second; //通過(guò)iterator it來(lái)訪問(wèn)第二個(gè)元素
}
cout<<"total="<<total<<endl;
}
 
//算法
int n = GetN(5); //遞歸n!=n*(n-1)*(n-2)*…*1
int aa=10,bb=15;
int maxi = max(aa,bb); //最大值
int mini = min(aa,bb); //最小值
int absi = abs(-12); //絕對(duì)值
vector<string> v;
v.push_back("hello");
v.push_back("123");
v.push_back("no");
sort(v.begin(),v.end()); //按照字母順序,把v里面的元素排序
int savei;
sscanf(v[0].c_str(), "%d", &savei); //把字符串“123”轉(zhuǎn)換成數(shù)字123
cout<<"savei="<<savei<<endl;
char buf[100];
sprintf(buf,"v[1]=%d",savei); //把內(nèi)容打印進(jìn)字符串
cout<<"buf="<<buf<<endl;
 
}

posted @ 2009-10-27 15:35 abilitytao 閱讀(754) | 評(píng)論 (2)編輯 收藏

TOPCODER入門(mén)教程(轉(zhuǎn))

本文根據(jù)經(jīng)典的TC教程完善和改編。
TopCoder:
http://www.topcoder.com/

基本規(guī)則
TopCoder的比賽類型很多,最常見(jiàn)的是周賽SRM(Single Round Match),另外還有TCHS SRM(TopCoder High School SRM,題目和SRM一樣,僅限中學(xué)生參加,參賽者水平較低,據(jù)說(shuō)漲rating很容易),馬拉松(Marathon Matchs),還有TCOpen(每年兩次的大比賽)之類的比賽。因?yàn)榇蠖鄶?shù)人都在做SRM,所以本文介紹的TC比賽即為SRM。
SRM的規(guī)則總結(jié)起來(lái)就是一句話:75分鐘做完3道難度遞增的題。
TC的每個(gè)用戶(handle)都有自己的積分(rating),從0-3000+不等。成績(jī)?cè)胶茫謹(jǐn)?shù)越高。
積分與顏色的對(duì)應(yīng)為:白色——未參賽(unrated);灰色——0~899;綠色——900~1199;藍(lán)色——1200~1499;黃色——1500~2199;紅色——2200+。另外排名最高的幾個(gè)人在TC客戶端中會(huì)變成紅色靶子圖標(biāo)。
比賽分為兩個(gè)Division,Div I和Div II。白色灰色和綠色的參加Div II,藍(lán)色黃色和紅色的參加Div I。Div I的題要比Div II難許多,一般DivII的最后一題和Div I的第一或第二題是一樣的。無(wú)論是Div I或Div II。三道題目的Score一般為250, 500和1000。
TC的計(jì)分規(guī)則很詭異,可以見(jiàn)http://www.topcoder.com/wiki/display/tc/Algorithm+Competition+Rating+System,但基本是沒(méi)人看的懂。不過(guò),TC積分規(guī)則的基本思想很簡(jiǎn)單。
首先是SRM每道題的計(jì)分規(guī)則。題目從打開(kāi)開(kāi)始計(jì)時(shí),隨著時(shí)間的流逝,你這道題目可能得到的分?jǐn)?shù)也越來(lái)越少。不過(guò)分?jǐn)?shù)減少的速率會(huì)逐漸變慢(有人說(shuō)是先快后慢再快再慢,我不清楚到底哪個(gè)是對(duì)的,不過(guò)總體趨勢(shì)是越來(lái)越慢),一般1000分的題目在降低到300分的時(shí)候就基本不會(huì)再下降太多了。每道題點(diǎn)擊Submit才算正式提交,如果Submit之后發(fā)現(xiàn)錯(cuò)誤,還可以再次點(diǎn)擊Submit修改提交,不過(guò)這樣會(huì)扣除這道題一定的分?jǐn)?shù)。
其次是TC的計(jì)分規(guī)則。復(fù)雜的數(shù)學(xué)公式很難看懂,但大概的計(jì)分思想是:根據(jù)此次比賽的得分算出一個(gè)這次比賽的rank,然后和以前的rank做比較,求出一個(gè)期望的rank,再根據(jù)這個(gè)期望的rank調(diào)整rating。而有時(shí)也會(huì)出現(xiàn)考得很砸但依然漲rating的情況,不過(guò)總體來(lái)說(shuō)TC的計(jì)分公式是十分穩(wěn)定的。

運(yùn)行環(huán)境
TC的客戶端是一個(gè)Java程序,所以需要JRE(Java Runtime Environment)或者JDK(Java Development Kit)來(lái)運(yùn)行。如果平時(shí)不寫(xiě)Java程序的話,裝JRE就可以了。畢竟JDK比JRE大一個(gè)數(shù)量級(jí),下載慢。安裝照著提示完成就行了。推薦使用1.4.1以后的版本,因?yàn)閹Я薺ava web start,可以快速登陸。具體方法下一部分講。
JRE下載地址(中文):
http://www.java.com/zh_CN/download/index.jsp

注冊(cè)
原文在注冊(cè)的地方?jīng)]有詳細(xì)說(shuō)明,但很多人似乎對(duì)注冊(cè)都有疑問(wèn)。所以這里我來(lái)注冊(cè)一個(gè)小號(hào),并通過(guò)整個(gè)過(guò)程講解如何注冊(cè)。
首先打開(kāi)http://www.topcoder.com/tc(本文后面TopCoder的主頁(yè)都指這個(gè)網(wǎng)址),然后點(diǎn)擊右上角的Register Now(沒(méi)看到?你可能看到了一個(gè)Login,目光向下挪一點(diǎn),那個(gè)紅底白字的“Register Now”就在下面)。接下來(lái)會(huì)彈出http://www.topcoder.com/reg這個(gè)頁(yè)面,因?yàn)槲覀円獏⒓覵RM,所以選擇第一個(gè),Competition Registration。如果要參加TCHS可以選擇第二個(gè)High School (Secondary School) Registration。這些以后都可以更改(這里沒(méi)有選的如果以后要選上,只需要更新個(gè)人設(shè)置并挑勾;如果選上的要撤銷(xiāo)選擇則需要點(diǎn)一個(gè)“Unregister”的鏈接)。這里選擇項(xiàng)目的多少和后面的頁(yè)面需要填寫(xiě)內(nèi)容的多少相關(guān),本文以只選擇第一項(xiàng)為例。
需要填寫(xiě)的項(xiàng)目和對(duì)應(yīng)的中文翻譯如下:

* Given Name:  名
* Surname:     姓
* Address1:  地址1
Address2:  地址2
Address3:  地址3(如果一行寫(xiě)不開(kāi),就在三行中分別寫(xiě))
* City:   城市
State (US Only):  地區(qū)(不在美國(guó)就不用選)
Postal Code:  郵編
Province:  省
* Country:  國(guó)家
* Country to represent:  代表國(guó)家(不知道啥意思,中國(guó)人兩個(gè)都填China就行)
* Timezone:  時(shí)區(qū)(選Asia/Chongqing)
Phone Number:  電話號(hào)碼
* Email Address:  電子郵件
* Confirm Email Address:  確認(rèn)電子郵件地址(就是把電子郵件地址重新打一遍)
Email Notifications:  郵件提醒(就是它給你發(fā)郵件提醒什么東西)
- Algorithm Competitions  算法比賽,就是SRM和TCOpen
- Software Development Opportunities  貌似就是有軟件開(kāi)發(fā)的項(xiàng)目就告訴你
- Employment Opportunities  工作機(jī)會(huì)
- TopCoder News & Events  新聞
* Enable Member Contact:  允許成員聯(lián)系(似乎就是說(shuō)是不是讓別人在TC上能找到你)
* Show / hide earnings:  顯示/隱藏收入(大概是說(shuō)別人是不是能看到你賺了多少錢(qián),TC的比賽可是有錢(qián)賺的)
* User Name:  用戶名(下面的話提醒你一定不要填錯(cuò),因?yàn)樽?cè)多個(gè)用戶是不符合規(guī)定的。據(jù)說(shuō)有人因?yàn)閯e人在TC客戶端和他打招呼說(shuō)“怎么你拿小號(hào)上了”,那個(gè)人的號(hào)就被封了)
* Password:  密碼
* Confirm Password:  確認(rèn)密碼
* Secret Question:  密碼找回問(wèn)題(找回密碼時(shí)需要回答這個(gè)問(wèn)題,注意至少要8個(gè)字符長(zhǎng),而一個(gè)中文字似乎算一個(gè)字符,所以最后可能要打幾個(gè)問(wèn)號(hào)補(bǔ)齊長(zhǎng)度)
* Secret Question Response:  密碼找回問(wèn)題答案
Quote:  座右銘,就是個(gè)簽名檔之類的東西
* Student/Professional:  學(xué)生/職業(yè)程序員
* = required  帶*的項(xiàng)目必填

填寫(xiě)之后點(diǎn)Term of Use下面的I Agree,再點(diǎn)Submit,完成提交。除了用戶名別的以后似乎都可以改。
接下來(lái)進(jìn)入Demographics頁(yè)面,這個(gè)大概相當(dāng)于一個(gè)注冊(cè)用戶情況調(diào)查。

* Age :  年齡
* Gender :  性別(Male男,F(xiàn)emale女)
* Ethnic Background :  民族背景(似乎選Asian or Pacific Islander就行吧……)
* Primary Interest in TopCoder :  在TC的主要興趣,看不懂的就選第一個(gè)吧,那個(gè)是說(shuō)你的興趣在獎(jiǎng)金……
* Shirt Size :  T-Shirt大小(有的比賽會(huì)給排名前N的選手發(fā)T-Shirt,這里你需要選擇適合自己的大小,如果選最后一個(gè)說(shuō)明你不想要T-Shirt,人家也不發(fā)你了。TC的T-Shirt還是挺好看的,比AStar的好)
* College Major :  大學(xué)的專業(yè)
* College Major Description :  這個(gè)不知道啥意思,隨便填點(diǎn)東西就行……
* Degree Program :  學(xué)位(從上到下分別為:準(zhǔn)學(xué)士,學(xué)士,碩士,博士,中學(xué)生)
* Graduation Year :  畢業(yè)年份
* Graduation Month :  畢業(yè)月份
* Clubs / Organizations :  組織(一般選None,可以按住Ctrl點(diǎn)鼠標(biāo)多選)
Other Clubs / Organizations :  其它組織
* School:  學(xué)校(點(diǎn)Choose School選擇學(xué)校,可以搜索,不過(guò)為啥shanghaijiaotong university才2個(gè)人注冊(cè)?!)
* Show / hide my school:  顯示/隱藏我的學(xué)校
GPA:  不懂的自己百度去……
GPA Scale:  同上
Resume:  簡(jiǎn)歷
* How did you hear about TopCoder?:  你怎么知道的TC,如果選了“Member Referral”的話,需要填寫(xiě)那個(gè)人在TC的用戶名(歡迎填寫(xiě)sqybi~)
* = required

點(diǎn)Submit,進(jìn)入Confirm頁(yè)面,確認(rèn)信息。如果有誤可以點(diǎn)Edit修改,否則點(diǎn)最下面的Confirm提交。
接下來(lái)進(jìn)入Success,提示你已經(jīng)發(fā)送一封郵件到你的郵箱中,你必須去點(diǎn)擊里面的鏈接激活用戶。激活之后就可以使用這個(gè)用戶了。

登錄
登錄的方法一般都是使用Java Web Start。
在TopCoder主頁(yè)(
http://www.topcoder.com/tc)最下方有一段話,第一句是“Load the Arena as an Applet or as a Java Web Start Application”。點(diǎn)“Java Web Start Application”,就會(huì)自動(dòng)下載登陸需要的文件(一個(gè)jnlp格式的文件,本機(jī)裝了JRE/JDK才能打開(kāi))。經(jīng)測(cè)試在IE7下這個(gè)鏈接似乎不管用,在Firefox 3下正常。
然后運(yùn)行下載下來(lái)的jnlp文件,就打開(kāi)了TC客戶端。第一次運(yùn)行和有更新的時(shí)候會(huì)自動(dòng)下載安裝程序,等待即可,很快。
在我這里有時(shí)會(huì)提示“語(yǔ)法錯(cuò)誤”,但沒(méi)有任何影響,點(diǎn)“確定”就可以。啟動(dòng)可能會(huì)慢一些,耐心等待。
然后輸入用戶名密碼,在Connection的地方選合適的登錄方式(一般Direct就行,如果不行的話可以試試別的或者用AUTODETECT自動(dòng)檢測(cè)),在PROXY處設(shè)置代理,點(diǎn)GO登陸。這時(shí)可能還會(huì)提示語(yǔ)法錯(cuò)誤,再確定就行,這個(gè)也沒(méi)有什么影響。

界面
下面的圖們來(lái)自原文,很經(jīng)典,不打算改動(dòng)了。請(qǐng)使用等寬字體瀏覽。
主界面:
———————————————————————–
|   Advertisements………….                                       |
———————————————————————–
| Main | Lobbies | Options | Practice Rooms | Active Contests | Help ||
———————————————————————–
|                                                 | Clock |           |
———————————————————————–
| Rating Key | Who’s here |                 Chat Area                 |
|     .      |            |                                           |
|     .      |            |                                           |
|     .      |            |                                           |
|     .      |            |                                           |
|     .      |            |                                           |
|————|            |                                           |
|  MESSAGES  |            |                                           |
|————|            |                                           |
|LEADER BOARD|            |                                           |
|————|            |                                           |
|            |            |                                           |
|            |            |——————————————-|
|            |            | >>_______________________________________ |
———————————————————————–
Advertisements 廣告。
菜單項(xiàng):
- Main里可以看在線名單和找人。
- Lobbies基本用不著,因?yàn)橛脩粢话愣荚贑hat Room 1。
- Options里是一些選項(xiàng)和顏色設(shè)置。
- Practice Rooms里有大量的練習(xí),都是以前比賽的題目
- Active Contests只有有比賽的時(shí)候才有用,顯示當(dāng)前正在進(jìn)行和將要進(jìn)行的比賽以及比賽注冊(cè)之類的東西。
- Help里是….不用說(shuō)了吧。
Rating Key: handle的顏色是隨著積分而改變的,這里顯示了積分與顏色的關(guān)系。
MESSAGES: 比賽的時(shí)候這里有注冊(cè)提示和clarification。
LEADER BOARD: 看每個(gè)room的最高分。
Who’s here: 當(dāng)前room里的人。
Chat Area: 聊天。

練習(xí)
在Practice Rooms里隨便選擇一個(gè)room就可以進(jìn)入practice了。
界面與主頁(yè)面稍有變化,但基本相同,略去不畫(huà)。主要的變化就是Who’s here分成了兩塊,多了一塊Who’s assigned。這塊顯示的是誰(shuí)被分到了這個(gè)room。因?yàn)槭蔷毩?xí)區(qū),所以只要是在這里打開(kāi)過(guò)題的都算是assigned。而在正式比賽中room是由TC分配的。這里顯示的是被分配到這個(gè)room的人。界面上還有一個(gè)變化是Chat Area頂上多了三塊。最左邊的是一個(gè)下拉菜單。里面有三個(gè)分值,選擇后就可以打開(kāi)相應(yīng)的題目。中間的summary可以看這個(gè)room里每個(gè)人的提交情況。
在practice room里只有coding phase。提交后要判的話需要自己選擇Practice Options(多出來(lái)的菜單項(xiàng))里的Run System Test。

比賽
每次比賽(除了1年兩次的大賽)都需要在賽前3小時(shí)-5分鐘之間登陸注冊(cè)方可參加,注冊(cè)需要在Active Contest菜單中,選擇你要參加的那個(gè)比賽,再選擇Register。注意比賽前5分鐘注冊(cè)停止,這時(shí)候如果沒(méi)有注冊(cè)就不能參賽了。而注冊(cè)了沒(méi)有打開(kāi)題目也視為沒(méi)有參賽,rating不變動(dòng)。
然后TopCoder開(kāi)始根據(jù)每個(gè)人的rating分配room,一般每個(gè)room都有高手和菜鳥(niǎo),只不過(guò)如果你的rating高,和高手分在一起的概率高一些(當(dāng)然也不一定是這樣,比如我上次就和yuhch大牛分在了一起……)
分配完成后,Active Contest菜單中Register一項(xiàng)變成Enter。選擇后可以直接進(jìn)入你被分配到的room。Active Contest菜單最下面還有一項(xiàng)暗色背景的Room子菜單,可以進(jìn)入各個(gè)room溜達(dá)。
進(jìn)入自己room的時(shí)候一般離開(kāi)始只有3分鐘左右,靜一下心就可以直接開(kāi)始比賽了。coding phase的過(guò)程與practice基本相同。注意每題的得分是和用的時(shí)間相關(guān)(見(jiàn)前面的計(jì)分規(guī)則),而時(shí)間是從你打開(kāi)該題開(kāi)始算的。所以一題做完后可以不急著打開(kāi)下一題,先放松一下。
75分鐘的coding后是5分鐘的intermission,這段時(shí)間是用來(lái)休息和聊天的。
然后就是最刺激的15分鐘challenge phase,也就是通常說(shuō)的cha人。打開(kāi)summary,雙擊別人的各題Score可以打開(kāi)那題的程序,如果覺(jué)得有錯(cuò)誤就可以點(diǎn)左下的Challenge然后輸入你認(rèn)為他會(huì)錯(cuò)的輸入數(shù)據(jù),如果輸入數(shù)據(jù)合法那么系統(tǒng)會(huì)用標(biāo)程的輸出和這個(gè)程序的輸出對(duì)比,如果出現(xiàn)不同則cha人成功。成功的話你能得到50分,對(duì)方該題分?jǐn)?shù)為0;而如果失敗了,你會(huì)被減去25分。每個(gè)程序只能成功被cha一次,也就是說(shuō),如果有人cha掉了這個(gè)程序,你就不能再次cha。但是一個(gè)人可以cha某個(gè)程序很多次,直到這個(gè)程序被cha掉或者你放棄。
Challenge結(jié)束后就是System Test。這個(gè)過(guò)程一般比較慢,可以先走開(kāi)做其他事,過(guò)20分鐘再回來(lái)看結(jié)果。System Test中的測(cè)試數(shù)據(jù)有兩種:一種是出題者準(zhǔn)備的測(cè)試數(shù)據(jù),一種是成功cha掉別人的數(shù)據(jù)。所以,TC中很少出現(xiàn)有bug的程序能通過(guò)System Test的情況。
結(jié)果出來(lái)后再過(guò)一段時(shí)間,就可以看到一系列message,比如rating更新了,新的practice room建好了以及可以通過(guò)主頁(yè)查看這次比賽的數(shù)據(jù)了。這時(shí)比賽就宣告結(jié)束。

注意事項(xiàng)
1.在TC主頁(yè)(
http://www.topcoder.com/tc)上可以看到Next SRM,這是下次SRM的時(shí)間。注意我們的時(shí)間與他們剛好相差12小時(shí),因此若時(shí)間是7月9日9:00 PM的話,這里是7月10日9:00 AM。還有要注意的是美國(guó)有夏令時(shí),非夏令時(shí)的時(shí)候,還要再加1小時(shí),就是7月10日10:00 AM。
2.Practice Rooms里寫(xiě)的程序只要點(diǎn)SAVE就可以保存,下次login的時(shí)候還可以看到,但是比賽時(shí)候的程序必須Submit才可以在coding phase結(jié)束后保存(coding phase結(jié)束前還是只要SAVE就可以的)。
3.若想cha別人的程序,自己必須是正分(0分也不行),所以若沒(méi)有一題有正確的程序但有很好的數(shù)據(jù)的話,隨便交一道看上去正確的程序,然后在challenge的時(shí)候快下手,就可以賺到了。
4.客戶端自帶的編輯器只有基本的編輯功能和編譯及測(cè)試功能,所以若覺(jué)得不方便的話可以使用parser和plugin,TC主頁(yè)最下面有plugin的連接。每個(gè)plugin都有詳細(xì)說(shuō)明文檔,這里不再贅述。
5.TC的FAQ:
http://www.topcoder.com/?&t=support&c=index
6.最后一條,千萬(wàn)不要作弊,會(huì)有嚴(yán)重的后果。

SRM的輸入輸出
SRM是不用標(biāo)準(zhǔn)或文件輸入和輸出的,只要寫(xiě)一個(gè)類的一個(gè)成員函數(shù)。也就是說(shuō),你需要編寫(xiě)的并不是一個(gè)完整的程序,而是一個(gè)類。
輸入是成員函數(shù)的參數(shù),輸出用return,所以經(jīng)常需要STL中的vector和string。
因?yàn)門(mén)C的系統(tǒng)并不測(cè)試標(biāo)準(zhǔn)輸出,所以標(biāo)準(zhǔn)輸出可以當(dāng)調(diào)試用。
下面以SRM 413 Div 2的1000分題目介紹程序的寫(xiě)法。
題目如下(選擇不同的語(yǔ)言,題目描述會(huì)略有不同,本文以C++為例):

Problem Statement
NOTE: This problem statement contains subscripts that may not display properly if viewed outside of the applet.

Let’s consider an infinite sequence A defined as follows:
A0 = 1;
Ai = A[i/p] + A[i/q] for all i >= 1, where [x] denotes the floor function of x. (see Notes)
You will be given n, p and q. Return the n-th element of A (index is 0-based).

Definition
Class:
InfiniteSequence
Method:
calc
Parameters:
long long, int, int
Returns:
long long
Method signature:
long long calc(long long n, int p, int q)
(be sure your method is public)

Notes
- [x] denotes the floor function of x which returns the highest integer less than or equal to x. For example, [3.4] = 3, [0.6] = 0.

Constraints
- n will be between 0 and 10^12, inclusive.
- p and q will both be between 2 and 10^9, inclusive.

Examples
0)
0
2
3
Returns: 1

A[0] = 1.

1)
7
2
3
Returns: 7

A[0] = 1; A[1] = A[0] + A[0] = 2; A[2] = A[1] + A[0] = 2 + 1 = 3; A[3] = A[2] + A[1] = 3 + 2 = 5; A[7] = A[3] + A[2] = 5 + 3 = 8.

2)
10000000
3
3
Returns: 32768

3)
256
2
4
Returns: 89

4)
1
1000000
1000000
Returns: 2

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.

下面是我寫(xiě)的一個(gè)錯(cuò)誤算法的程序,僅供參考格式用:

#include <string>
#include <vector>
class InfiniteSequence {
public:
long long calc(long long n, int p, int q) {
if (n == 0)
return 1;
else
return calc(n/p, p, q) + calc(n/q, p, q);
}
};

轉(zhuǎn)自:http://sqybi.com/blog/archives/25

posted @ 2009-10-27 14:59 abilitytao 閱讀(5780) | 評(píng)論 (0)編輯 收藏

記于松江維也納賓館

   22:59分,地點(diǎn):松江維也納賓館
   洗完澡,大家都在看電視,于是偶就占著電腦,心里總是覺(jué)得有什么事情沒(méi)有做完,突然想到寫(xiě)一篇博客當(dāng)是一個(gè)很有意義的選擇了吧^_^
   其實(shí)今天一整天幾乎都是在旅行中度過(guò)的,早上8點(diǎn)半和CY,ZJH三個(gè)人一起坐車(chē)到火車(chē)站,然后隨隊(duì)一起坐上了去松江的火車(chē)。本來(lái)我以為是做動(dòng)車(chē)的,但是貌似南京沒(méi)有到松江的動(dòng)車(chē),所以我們乘坐了普快列車(chē)。大概下午6,7點(diǎn)才到的,下了火車(chē),發(fā)現(xiàn)天已經(jīng)黑了,我們趕緊坐車(chē)來(lái)到了維也納賓館,來(lái)到賓館,總算感覺(jué)到有比賽的氣氛了,右側(cè)有好多好多穿著ACM制服的工作人員呢。我們抽完簽,魚(yú)頭讓我們8個(gè)先去餐廳吃飯,去餐廳的途中,有人說(shuō)他看到了樓天成,真的么?難道他第二次復(fù)出?走過(guò)去才發(fā)現(xiàn)真的是樓教主,他對(duì)著墻上的畫(huà)若有所思,難道在懷念當(dāng)年ACM的歲月?呵呵,我跟他聊了一兩句,然后就去餐廳吃飯,說(shuō)實(shí)話,飯真的不怎么樣,對(duì)于飯量大的人來(lái)說(shuō)(比如我)根本就不夠。。。吃完飯,大家都去了各自的房間,房間很不錯(cuò)的,還能免費(fèi)上網(wǎng)呵~
   好吧,就到這啦,睡覺(jué)啦Zzzzz~~~~

posted @ 2009-10-23 23:19 abilitytao 閱讀(251) | 評(píng)論 (0)編輯 收藏

匹配問(wèn)題學(xué)習(xí)小結(jié)(POJ)

臨行上海,決定把最近研究過(guò)的各種匹配題做個(gè)匯總,原因是這樣既可以鞏固自己對(duì)匹配問(wèn)題的掌握,又可以借此復(fù)習(xí)一下匹配問(wèn)題的各種外在表現(xiàn)形式。我認(rèn)為,如果比賽中出到匹配,出題者在問(wèn)題的算法上大做文章的可能性不大,大多數(shù)出題者一定會(huì)挖空心思來(lái)設(shè)計(jì)一個(gè)讓你眼花繚亂的背景,借此來(lái)隱藏匹配問(wèn)題的實(shí)質(zhì)!

二分圖最小覆蓋的Konig定理及其證明

二分圖:

頂點(diǎn)可以分類兩個(gè)集合X和Y,所有的邊關(guān)聯(lián)在兩個(gè)頂點(diǎn)中,恰好一個(gè)屬于集合X,另一個(gè)屬于集合Y。

最小覆蓋:

最小覆蓋要求用最少的點(diǎn)(X集合或Y集合的都行)讓每條邊都至少和其中一個(gè)點(diǎn)關(guān)聯(lián)。可以證明:最少的點(diǎn)(即覆蓋數(shù))=最大匹配數(shù)

Konig定理:

二分圖的最小頂點(diǎn)覆蓋數(shù)等于最大匹配數(shù)。

 證明:

 為主便敘述,假設(shè)G分為左邊X和右邊Y兩個(gè)互不相交的點(diǎn)集。。。。。。

假設(shè)G經(jīng)過(guò)匈牙利算法后找到一個(gè)最大匹配M,則可知G中再也找不到一條增廣路徑。

標(biāo)記右邊未匹配邊的頂點(diǎn),并從右邊未匹配邊的頂點(diǎn)出發(fā),按照邊:未匹配->匹配->未匹配...,的原則標(biāo)記途中經(jīng)過(guò)的頂點(diǎn),則最后一條經(jīng)過(guò)的邊必定為匹配邊。重復(fù)上述過(guò)程,直到右邊不再含有未匹配邊的點(diǎn)。

記得到的左邊已標(biāo)記的點(diǎn)和右邊未標(biāo)記的點(diǎn)為S, 以下證明S即為所求的最小頂點(diǎn)集。

1| S | == M 
    顯然,左邊標(biāo)記的點(diǎn)全都為匹配邊的頂點(diǎn),右邊未標(biāo)記的點(diǎn)也為匹配邊的頂點(diǎn)。因此,我們得到的點(diǎn)與匹配邊一一對(duì)應(yīng)。

2S能覆蓋G中所有的邊。

       上途S中點(diǎn)所得到的邊有以下幾種情況:

       1)左右均標(biāo)記;

       2)左右均無(wú)標(biāo)記;

       3)左邊標(biāo)記,右邊未標(biāo)記;

       若存在一條邊e不屬于S所覆蓋的邊集,則e 左邊未標(biāo)記右邊標(biāo)記。

如果e不屬于匹配邊,那么左端點(diǎn)就可以通過(guò)這條邊到達(dá)(從而得到標(biāo)記);如果e屬于匹配邊,那么右端點(diǎn)不可能是一條路徑的起點(diǎn),于是它的標(biāo)記只能是從這條邊的左端點(diǎn)過(guò)來(lái)的左端點(diǎn)就應(yīng)該有標(biāo)記。

 

3S是最小的覆蓋。

       因?yàn)橐采w這M條匹配邊至少就需要M個(gè)點(diǎn)。

轉(zhuǎn)自:http://yejingx.ycool.com/post.2801156.html#



在一個(gè)PXP的有向圖中,路徑覆蓋就是在圖中找一些路經(jīng),使之覆蓋了圖中的所有頂點(diǎn),且任何一個(gè)頂點(diǎn)有且只有一條路徑與之關(guān)聯(lián);(如果把這些路徑中的每條路徑從它的起始點(diǎn)走到它的終點(diǎn),那么恰好可以經(jīng)過(guò)圖中的每個(gè)頂點(diǎn)一次且僅一次);如果不考慮圖中存在回路,那么每每條路徑就是一個(gè)弱連通子集.

由上面可以得出:

1.一個(gè)單獨(dú)的頂點(diǎn)是一條路徑;

2.如果存在一路徑p1,p2,......pk,其中p1 為起點(diǎn),pk為終點(diǎn),那么在覆蓋圖中,頂點(diǎn)p1,p2,......pk不再與其它的頂點(diǎn)之間存在有向邊.

最小路徑覆蓋就是找出最小的路徑條數(shù),使之成為P的一個(gè)路徑覆蓋.

路徑覆蓋與二分圖匹配的關(guān)系:

最小路徑覆蓋=|P|-最大匹配數(shù);

其中最大匹配數(shù)的求法是把P中的每個(gè)頂點(diǎn)pi分成兩個(gè)頂點(diǎn)pi'與pi'',如果在p中存在一條pi到pj的邊,那么在二分圖P'中就有一條連接pi'與pj''的無(wú)向邊;這里pi' 就是p中pi的出邊,pj''就是p中pj 的一條入邊;

對(duì)于公式:最小路徑覆蓋=|P|-最大匹配數(shù);可以這么來(lái)理解;

如果匹配數(shù)為零,那么P中不存在有向邊,于是顯然有:

最小路徑覆蓋=|P|-最大匹配數(shù)=|P|-0=|P|;即P的最小路徑覆蓋數(shù)為|P|;

P'中不在于匹配邊時(shí),路徑覆蓋數(shù)為|P|;

如果在P'中增加一條匹配邊pi'-->pj'',那么在圖P的路徑覆蓋中就存在一條由pi連接pj的邊,也就是說(shuō)pi與pj 在一條路徑上,于是路徑覆蓋數(shù)就可以減少一個(gè);

如此繼續(xù)增加匹配邊,每增加一條,路徑覆蓋數(shù)就減少一條;直到匹配邊不能繼續(xù)增加時(shí),路徑覆蓋數(shù)也不能再減少了,此時(shí)就有了前面的公式;但是這里只 是說(shuō)話了每條匹配邊對(duì)應(yīng)于路徑覆蓋中的一條路徑上的一條連接兩個(gè)點(diǎn)之間的有向邊;下面來(lái)說(shuō)明一個(gè)路徑覆蓋中的每條連接兩個(gè)頂點(diǎn)之間的有向邊對(duì)應(yīng)于一條匹配 邊;

與前面類似,對(duì)于路徑覆蓋中的每條連接兩個(gè)頂點(diǎn)之間的每條有向邊pi--->pj,我們可以在匹配圖中對(duì)應(yīng)做一條連接pi'與pj''的邊, 顯然這樣做出來(lái)圖的是一個(gè)匹配圖(這一點(diǎn)用反證法很容易證明,如果得到的圖不是一個(gè)匹配圖,那么這個(gè)圖中必定存在這樣兩條邊  pi'---pj'' 及 pi' ----pk'',(j!=k),那么在路徑覆蓋圖中就存在了兩條邊pi-->pj, pi--->pk ,那邊從pi出發(fā)的路徑就不止一條了,這與路徑覆蓋圖是矛盾的;還有另外一種情況就是存在pi'---pj'',pk'---pj'',這種情況也類似可證);

至此,就說(shuō)明了匹配邊與路徑覆蓋圖中連接兩頂點(diǎn)之間邊的一一對(duì)應(yīng)關(guān)系,那么也就說(shuō)明了前面的公式成立!

轉(zhuǎn)自:http://hi.baidu.com/cjhh314/blog/item/ded8d31f15d7510c304e1591.html





POJ 1469 COURSES
學(xué)生選課問(wèn)題,基礎(chǔ)匹配問(wèn)題。
有p節(jié)課,n個(gè)學(xué)生,每節(jié)課可以由指定的幾個(gè)學(xué)生參加,但是每個(gè)學(xué)生只能參加一節(jié)課。現(xiàn)在問(wèn)能不能找到一些學(xué)生使得他們:
1.每個(gè)學(xué)生匹配不同的一節(jié)課
2.每節(jié)課匹配一個(gè)學(xué)生。
就是求個(gè)最大匹配,看看匹配數(shù)是不是等于課程數(shù)。如果相等不就滿足要求了么.


POJ 3041 Asteroids
在N*N的平面上有K顆小行星,現(xiàn)在你要摧毀他們,你的每一發(fā)子彈可以摧毀同一行,或者是同一列上的小行星,現(xiàn)在問(wèn)你最少要多少子彈才能摧毀所有的小行星?
構(gòu)圖:如果在i行j列上有一顆小行星 則graph[i][j]=1,再求最大匹配即可。
這一題用到的結(jié)論是 :最小頂點(diǎn)覆蓋 = 最大匹配(最小覆蓋要求用最少的點(diǎn)(X集合或Y集合的都行)讓每條邊都至少和其中一個(gè)點(diǎn)關(guān)聯(lián))


POJ 2771 Guardian of Decency
老師帶學(xué)生出去旅游,但是擔(dān)心學(xué)生會(huì)發(fā)生戀愛(ài)關(guān)系,所以帶出去的學(xué)生至少要滿足以下要求之中的一個(gè):
1.身高相差40cm以上
2.同性
3.喜歡的音樂(lè)風(fēng)格不同
4.喜歡的運(yùn)動(dòng)相同
問(wèn)最多可以帶出去多少學(xué)生?

個(gè)人感覺(jué)如果有男有女,就很有可能是二分匹配了。
這道題我們反過(guò)來(lái)想,如果將所有可能發(fā)生戀愛(ài)關(guān)系的男女配對(duì),那么可以帶出去的人數(shù)應(yīng)該等于這個(gè)二分圖的最大獨(dú)立集。
根據(jù)公式: 最大獨(dú)立集=頂點(diǎn)數(shù)(包括X和Y)-最大匹配
求一次匹配即可。

POJ 3020 Antenna Placement
題目的意思大致就是,一個(gè)矩形中,有N個(gè)城市,現(xiàn)在這n個(gè)城市都要覆蓋無(wú)線,若放置一個(gè)基站,那么它至多可以覆蓋相鄰的兩個(gè)城市。
問(wèn)至少放置多少個(gè)基站才能使得所有的城市都覆蓋無(wú)線?
構(gòu)圖:行掃描所有城市,編號(hào),如果有城市相鄰就連一條邊,當(dāng)然如果3和4相鄰,首先graph[3][4]=1,當(dāng)掃描到4時(shí)graph[4][3]也連一條邊,最后只需要取一半即可.求最大匹配的一半,這樣可以得到所有2個(gè)相鄰城市被一個(gè)基站覆蓋所需要的基站數(shù)。然后再加上獨(dú)立的那些基站即可。
公式是:N-最大匹配(代表所有可以和相鄰城市配對(duì)的城市數(shù))+最大匹配/2=N-最大匹配/2;

POJ 1325 Machine Schedule
兩臺(tái)機(jī)器A,B,A有n個(gè)模式,B有m個(gè)模式,現(xiàn)在有k個(gè)工作,其中每一個(gè)工作可以由A或B中的一個(gè)特定模式來(lái)完成,但是切換機(jī)器的模式要重新啟動(dòng)一次,問(wèn)最少要重啟多少次機(jī)器才能完成所有工作?
A,B兩臺(tái)機(jī)器構(gòu)成一個(gè)二分圖,在之間按照給出的條件連邊。這樣想,每一個(gè)工作其實(shí)是由一條邊來(lái)代表的,那么我們只要用最少的頂點(diǎn)來(lái)覆蓋所有的邊即可。這就是最小覆蓋。
根據(jù)公式:最小覆蓋=最大匹配;
對(duì)原二分圖做一次最大匹配即可。
對(duì)了,針對(duì)這個(gè)題還有一個(gè)問(wèn)題,就是起始狀態(tài)下是在mode 0的,如果在這個(gè)模式下工作,是不需要切換mode的,所以只要有工作是在mode 0下(不管是在A還是在B),對(duì)這個(gè)工作就不連邊,默認(rèn)它不占匹配數(shù)!記得當(dāng)時(shí)就是錯(cuò)在這里,轉(zhuǎn)化很重要啊!

POJ 2226 Muddy Fields(*)
這個(gè)題的原型應(yīng)該是Asteroids的變種,剛看了這道題,一眼就看出了是最小覆蓋,看來(lái)我理解了最小覆蓋的內(nèi)在含義了。
農(nóng)夫John的養(yǎng)牛場(chǎng),是一個(gè)R 行C 列的矩形,一場(chǎng)大雨后,養(yǎng)牛場(chǎng)低洼的地方都有了積水。John 的牛都很嬌貴的,他們吃草的時(shí)候,不想把他們的蹄子給弄臟了。為了不讓牛兒們把它們的蹄子弄臟,John 決定把有水的地方鋪上木板。他的木板是寬度為1,長(zhǎng)度沒(méi)有限制的。 

他想用最少數(shù)目的木板把所有有水的低洼處給覆蓋上,前提是木板不能覆蓋草地,但是可以重疊。
Sample:
4 4
*.*.
.***
***.
..*.

把行里面連在一起的坑連起來(lái)視為一個(gè)點(diǎn),即一塊橫木板,編上序號(hào),Sample則轉(zhuǎn)化為:

1 0 2 0
0 3 3 3
4 4 4 0
0 0 5 0

把這些序號(hào)加入X集合,再按列做一次則為:

1 0 4 0
0 3 4 5
2 3 4 0
0 0 4 0

同樣加入Y集合,一個(gè)坑只能被橫著的或者被豎著的木板蓋住,將原圖的坑的也標(biāo)上不同的序號(hào),一共九個(gè)坑

1 . 2 .
. 3 4 5
67 8 .
. . 9 .

比如7號(hào)坑可以被橫著的4號(hào)木板和豎著的3號(hào)木板蓋住,把每個(gè)點(diǎn)的對(duì)應(yīng)的橫木板(4)和豎木板(3)中間連一條邊的話,則問(wèn)題轉(zhuǎn)化為 找盡量少的邊把這些點(diǎn)都蓋住,根據(jù)定理便是求最大匹配數(shù).

POJ 1422 Air Raid 空襲!
典型的最小路徑覆蓋題,城市之間單向相連,無(wú)環(huán)!問(wèn)最少用多少個(gè)傘兵能遍歷這張圖。
根據(jù)定理:最小路徑覆蓋=頂點(diǎn)數(shù)-最大匹配數(shù)


POJ 3216 Repairing Company(*)
題目說(shuō)的是一個(gè)城市里面有Q個(gè)點(diǎn),有M項(xiàng)工作,每個(gè)工作有個(gè)工作地點(diǎn)pi,最晚開(kāi)始時(shí)間ti,和工作需要的時(shí)間di.
從城市中的任意一個(gè)點(diǎn)到另一個(gè)點(diǎn)的直接時(shí)間又一個(gè)矩陣給出。不連通為-1.注意間接聯(lián)通是被允許的。
我再這個(gè)題上哉了2次,汗啊。我總是以為二分圖的頂點(diǎn)時(shí)基于城市中的點(diǎn)的,但實(shí)際上時(shí)基于工作。

這一題首先對(duì)給定的圖做一次floyd,這樣就能求出兩個(gè)點(diǎn)之間最少需要走的時(shí)間。
然后判斷兩個(gè)工作之間是否存在先后關(guān)系

for(i=1;i<=m;i++)
    
{

        scanf(
"%d%d%d",&work[i].p,&work[i].t,&work[i].d);
    }

    
for(i=1;i<=m;i++)
        
for(j=1;j<=m;j++)
        
{

            
if(work[i].t+work[i].d+g[work[i].p][work[j].p]<=work[j].t)
                graph[i][j]
=1;
        }


最后做最小路徑覆蓋即可。注意這里的頂點(diǎn)數(shù)應(yīng)該是工作數(shù)!這一題值得重點(diǎn)注意!!!
printf("%d\n",m-Hungary(m,graph));

POJ 2594 Treasure Exploration(*)
太經(jīng)典了,最小路徑覆蓋之變形!如果題目中有暗示此圖無(wú)環(huán)且路徑是單向的話,必然是最小路徑覆蓋無(wú)疑!

這個(gè)題的題目意思和那個(gè)傘兵題差不多,但是傘兵走過(guò)的路徑是可以交叉的,這樣我們先做一個(gè)傳遞閉包,然后再連邊做最小路徑覆蓋即可。

POJ 1034 The dog task
一個(gè)很明顯的二分匹配,不過(guò)和計(jì)算幾何聯(lián)系起來(lái)了。這道題目建圖很巧妙.以BOB行走的n-1條有向線段為X,m個(gè)景點(diǎn)為Y,二分匹配。


暫時(shí)總結(jié)到這,對(duì)于匹配問(wèn)題,我只想說(shuō),匹配問(wèn)題,你真的很"2"!

posted @ 2009-10-21 17:34 abilitytao 閱讀(2353) | 評(píng)論 (1)編輯 收藏

并查集學(xué)習(xí)小節(jié)(POJ版)

     摘要: 什么是并查集呢,我相信大家都已經(jīng)很熟悉了,在這里我就不再贅述。寫(xiě)這篇文章的主要目的不是新手教學(xué),而是為了借POJ上相關(guān)的題目,全面的總結(jié)一下并查集問(wèn)題和它的各個(gè)變種。POJ 1611 The Suspects題目大意:有n個(gè)學(xué)生(標(biāo)號(hào)為0 to n-1),m個(gè)學(xué)生社團(tuán),給出每個(gè)社團(tuán)里所有學(xué)生的標(biāo)號(hào),并假設(shè)0號(hào)學(xué)生患有SARS(社團(tuán)里只要用一個(gè)學(xué)生患病,則整個(gè)社團(tuán)里的學(xué)生都會(huì)被隔離),問(wèn)最后一共會(huì)有...  閱讀全文

posted @ 2009-10-18 21:31 abilitytao 閱讀(3199) | 評(píng)論 (5)編輯 收藏

僅列出標(biāo)題
共42頁(yè): First 23 24 25 26 27 28 29 30 31 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品乱码久久久久| 男女av一区三区二区色多| 美女黄毛**国产精品啪啪| 欧美成人精品一区二区三区| 欧美在线免费一级片| 99精品国产在热久久| 夜夜嗨av一区二区三区中文字幕| 亚洲国产日韩欧美一区二区三区| 国内精品亚洲| 91久久精品www人人做人人爽| 亚洲福利小视频| 亚洲国产毛片完整版| 亚洲精品乱码| 亚洲视频二区| 久久精品久久99精品久久| 久久久噜噜噜久噜久久| 免费观看成人网| 亚洲免费电影在线观看| 亚洲一区二区久久| 欧美在线视频在线播放完整版免费观看 | 亚洲天堂av在线免费| 亚洲视频第一页| 欧美一区午夜视频在线观看| 麻豆成人在线| 国产精品麻豆成人av电影艾秋| 国产在线成人| 一区二区三区四区精品| 久久国产精品一区二区三区| 欧美电影电视剧在线观看| 亚洲美女在线观看| 欧美在线观看视频一区二区三区| 老司机精品福利视频| 国产精品r级在线| 亚洲成色999久久网站| 亚洲自拍偷拍福利| 欧美大片在线观看| 亚洲一区在线视频| 欧美aⅴ一区二区三区视频| 国产精品电影网站| 亚洲国产婷婷综合在线精品 | 亚洲第一久久影院| 亚洲视频综合| 欧美h视频在线| 国产精品久久久999| 亚洲国产精品久久| 午夜激情久久久| 亚洲欧洲日产国产综合网| 欧美一区二区在线免费观看| 免费久久99精品国产自在现线| 国产欧美日韩91| 亚洲美女淫视频| 欧美成人精精品一区二区频| 亚洲欧美成人一区二区在线电影| 中文在线资源观看视频网站免费不卡| 久久精品视频va| 亚洲精华国产欧美| 久久精品91| 国产精品五月天| 亚洲午夜精品久久久久久app| 欧美福利在线| 久久久精品国产免费观看同学| 国产欧美日韩三级| 午夜精品福利一区二区蜜股av| 亚洲伦理精品| 欧美精品麻豆| 亚洲一区二区免费| 亚洲精品一区二区三| 免费在线看成人av| 亚洲国产欧美一区二区三区同亚洲 | 欧美xart系列高清| 久久不见久久见免费视频1| 国产精品久久中文| 亚洲欧美日韩在线播放| 一区二区三区久久精品| 欧美体内she精视频在线观看| 国产精品久99| 亚洲欧美日产图| 亚洲午夜精品福利| 国产精品永久在线| 久久久久久久尹人综合网亚洲| 欧美专区一区二区三区| 合欧美一区二区三区| 蜜臀av一级做a爰片久久 | 国产日韩欧美在线播放| 久久精品电影| 噜噜噜在线观看免费视频日韩| 最新日韩欧美| 一本色道久久综合| 国产精品五月天| 欧美成人黄色小视频| 欧美三区在线视频| 久久激五月天综合精品| 久久久水蜜桃| 国产精品99久久久久久久久| 亚洲欧美国产制服动漫| 在线观看欧美一区| 亚洲国产精品女人久久久| 欧美日韩亚洲一区二| 久久成人精品| 欧美电影免费观看高清完整版| 亚洲香蕉网站| 久久精品色图| 中文欧美在线视频| 欧美一区二区三区在线免费观看 | 99精品欧美一区二区三区| 欧美久久久久久久久| 欧美高清视频在线播放| 香蕉久久a毛片| 欧美大香线蕉线伊人久久国产精品| 久久综合网hezyo| 国内精品国语自产拍在线观看| 亚洲欧洲av一区二区| 亚洲激情综合| 欧美精品电影在线| 亚洲日本成人网| 99riav1国产精品视频| 欧美日韩亚洲激情| 亚洲欧美国产视频| 欧美aa在线视频| 亚洲精品乱码久久久久久蜜桃麻豆| 牛夜精品久久久久久久99黑人| 亚洲电影免费| 在线视频精品一| 欧美国产欧美综合| 欧美一区二区三区啪啪| 免费久久精品视频| 久久久久久尹人网香蕉| 欧美色123| 亚洲狼人精品一区二区三区| 影音先锋久久久| 欧美亚洲在线播放| 欧美亚洲免费电影| 日韩视频精品在线| 欧美一区二区日韩| 亚洲第一精品在线| 国产精品扒开腿做爽爽爽软件 | 欧美一区二区三区免费观看视频 | 一区二区三区鲁丝不卡| 久久一区中文字幕| 黑人中文字幕一区二区三区| 亚洲视频精品在线| 猛男gaygay欧美视频| 国产精品99久久久久久人| 国产综合欧美在线看| 欧美日韩高清在线| 久久精品1区| 亚洲一级二级| 亚洲国产一区二区精品专区| 香蕉免费一区二区三区在线观看| 亚洲国产高清一区二区三区| 国产精品久久久久久久7电影| 亚洲理论在线| 国语自产在线不卡| 久久久综合精品| 欧美高清视频一二三区| 亚洲日韩欧美视频一区| 欧美人与禽性xxxxx杂性| 日韩亚洲不卡在线| 午夜欧美精品| 好男人免费精品视频| 免费看黄裸体一级大秀欧美| 亚洲乱码国产乱码精品精98午夜| 国产一区亚洲一区| 久久免费视频一区| 国产在线国偷精品产拍免费yy| 欧美国产成人在线| 欧美一级视频精品观看| 亚洲免费观看| 亚洲黄色av| 亚洲一区日韩在线| 亚洲欧洲一区二区天堂久久| 国产欧美一区二区在线观看| 欧美日韩不卡视频| 欧美激情精品久久久久久免费印度| 欧美在线资源| 亚洲欧美日韩国产| 国产精品99久久久久久人| 亚洲精品视频在线观看网站| 亚洲国产视频一区| 91久久精品国产91久久| 亚洲欧洲日本mm| 亚洲日本在线观看| 亚洲欧美国产一区二区三区| 久久久久久穴| 久久亚洲精品网站| 亚洲精品一区中文| 一区二区三区视频在线观看| 国产午夜精品美女视频明星a级| 免费一级欧美片在线观看| 亚洲午夜精品福利| 亚洲电影免费观看高清完整版| 亚洲欧美日韩在线不卡| 91久久国产综合久久| 国产一区二区欧美日韩| 欧美视频精品一区| 你懂的成人av| 久久久五月天| 久久精品视频播放| 亚洲欧美日韩精品久久奇米色影视| 亚洲欧洲一区二区天堂久久|