久久精品91,久久国产66,国产精品日韩在线观看http://m.shnenglu.com/klion/category/13667.htmlklion26's blogzh-cnTue, 30 Nov 2010 14:45:56 GMTTue, 30 Nov 2010 14:45:56 GMT60USACO 4_1_1 Beef McNuggetshttp://m.shnenglu.com/klion/archive/2010/11/26/134743.htmlKlionKlionFri, 26 Nov 2010 10:36:00 GMThttp://m.shnenglu.com/klion/archive/2010/11/26/134743.htmlhttp://m.shnenglu.com/klion/comments/134743.htmlhttp://m.shnenglu.com/klion/archive/2010/11/26/134743.html#Feedback0http://m.shnenglu.com/klion/comments/commentRss/134743.htmlhttp://m.shnenglu.com/klion/services/trackbacks/134743.html題目意思
我的想法:首先把一些能表達(dá)的數(shù)給算出來,存起來.然后再看是不是都能表示或者沒有最大值.算出能表達(dá)的數(shù)我采用的是dp.這里的dp,比如說有給你三個數(shù)3 6 10要你求用這三個數(shù)能表達(dá)的一系列數(shù),首先我用一個數(shù)組can[]記錄所有能表達(dá)的數(shù),can[i]=j表示這些能表達(dá)的數(shù)按升序排列地i個是j.再用數(shù)組記錄下3 6 10這三個數(shù)和can數(shù)組里面的某個數(shù)相加時所到的下表(說的很拗口- -)
比如說我用idx[0]記錄3這個數(shù)和can數(shù)組的第idx[0]個數(shù)相加,idx[1]表示6和can數(shù)組的第idx[1]個數(shù)相加.等等。下面用具體寫下過程.
首先置can[0] = 0  idx[0] = idx[1] = idx[2] = 0;(也就是說3 6 10接下來會和can數(shù)組的第0個相加)
下標(biāo)           0  1                    2                                   3                                    4                         5                     
        can   0   3(3+can[0])  6(3+can[1]/6+can[0])  9(3+can[2]/6+can[1])   10(10+can[0])   12(3+can[3]/6+can[2]) 
3   idx[0]   0  1                    2                                   3                                    3                         4                    
6   idx[1]   0  0                    1                                   2                                    2                         3                    
10 idx[2]   0  0                    0                                   0                                    1                         1                    
中間我還加了些東西,也就是說如果只有一個元素的話,那么一定是輸出0的(要不是都能表示[這個數(shù)是1]要不是無最大值)
如果有一個元素是1的話,那么一定輸出0(所有的都能表示)
如果只有兩個數(shù)的話,那么我們可以直接得到答案,如果兩個數(shù)互素的話,結(jié)果是a*b-a-b,如果不互素的話輸出0(無最大值)
如果是等差數(shù)列的話,輸出0(無最大值)
其他的就直接算出能表示的數(shù),再判斷輸出什么
官方的解題報(bào)告說 只要所有的數(shù)的gcd不是1就沒有最大值,其實(shí)這一點(diǎn)可以由上面2個數(shù)的公式推出來,也就是先求前n-1個數(shù)的gcd然后再求gcd和第n個數(shù)的gcd,那么這樣的話,這題還有一個數(shù)論方法,也就是直接算前n-1個數(shù)的gcd,然后看這個gcd和第n個數(shù)的gcd是否為1,不為1就輸出0,為1就用a*b-a-b這個公式算
代碼如下    
/*
    ID:qcx97811
    LANG:C++
    PROG:nuggets
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int n;
int num[16];
int idx[16],total_idx;
int can[2000000];
int cmp(const void *a,const void *b)
{//快速排序從小到大模板
    int *c = (int *)a;
    int *d = (int *)b;
    if(*c > *d)
        return 1;
    if(*c == *d)
        return 0;
    return -1;   
}
int gcd(int a,int b)
{//公約數(shù)
    int tmp;
    if(a < b)
        {
            tmp = a;
            a = b;
            b =tmp;       
        }
    while(b)
        {
            tmp = a;
            a = b;
            b = tmp%b;
        }
    return a;
}
int main(void)
{
    freopen("nuggets.in","r",stdin);
    freopen("nuggets.out","w",stdout);
    int i,j;
    int k,tmp;
    scanf("%d",&n);
    for(i = 0;i < n;i++)
        {//scanf
            scanf("%d",&num[i]);
        }   
    qsort(num,n,sizeof(num[0]),cmp);//sort the number
    if((1 == num[0]) || (1 == n))
        {//only one num or an one in the num
            printf("0\n");
            return 0;
        }
    else
        {
           memset(idx,0,sizeof(idx));
           memset(can,0,sizeof(can));
           if(2 == n)
             {//2個數(shù)的話可以直接算出來
                if(1 == gcd(num[0],num[1]))
                      {//如果互素的話
                           printf("%d\n",num[0]*num[1]-num[0]-num[1]);
                        return 0;
                      }
                else
                    {//不互素 肯定無
                        printf("0\n");
                        return 0;
                    }
             }
           tmp = num[1] - num[0];
           for(i = 2;i < n;i++)
             {//看是否為等差數(shù)列
            if(num[i]-num[i-1] != tmp)
               break;
             }
           if(i == n)
             {//如果是等差數(shù)列的話 也不可能有
            printf("0\n");
            return 0;
             }
           can[0] = 0;
           total_idx = 0;
           for(i = num[0];i < 2000000;i++ )
             {//下標(biāo)是為了不超過內(nèi)存16M 同時最大
                j = 0;
                for(k = 1;k < n;k++)
                   {//增大能表示的數(shù)
                      if(num[k]+can[idx[k]]<num[j]+can[idx[j]])
                        j = k;
                   }
                tmp = num[j]+can[idx[j]];
                can[++total_idx] = tmp;
                if(total_idx > num[0]-1 && (can[total_idx]-can[total_idx-num[0]+1] == num[0]-1))
                   {//如果已經(jīng)找到最大數(shù),因?yàn)楹竺娴臄?shù)都連續(xù)了
                    tmp = total_idx-num[0]+1;
                     while(can[tmp] - can[tmp-1] == 1)
                    {//尋找最大的數(shù)
                       tmp--
                    }    
                     printf("%d\n",can[tmp]-1);//輸出最大數(shù)
                     return 0;               
                   }
                for(k = 0;k < n;k++)
                    {//改變相應(yīng)的下標(biāo)
                        if(num[k]+can[idx[k]] == tmp)
                            idx[k]++;
                    }
               }
//            for(i = 0;i <= total_idx;i++)
//              printf("%d\n",can[i]);
            printf("0\n");       
        }
    return 0;
}
 

Klion 2010-11-26 18:36 發(fā)表評論
]]>
HDU_2519 組合數(shù)的另一種防溢出算法http://m.shnenglu.com/klion/archive/2010/09/16/126803.htmlKlionKlionThu, 16 Sep 2010 15:22:00 GMThttp://m.shnenglu.com/klion/archive/2010/09/16/126803.htmlhttp://m.shnenglu.com/klion/comments/126803.htmlhttp://m.shnenglu.com/klion/archive/2010/09/16/126803.html#Feedback0http://m.shnenglu.com/klion/comments/commentRss/126803.htmlhttp://m.shnenglu.com/klion/services/trackbacks/126803.html轉(zhuǎn)載請注明出處:http://www.klion.0fees.net/?p=47

今天無意中再群里看到有人在討論計(jì)算組合數(shù)的一種方法
感覺還有點(diǎn)用就記錄下來了  稍稍的證明了下  證明不是很嚴(yán)密,看官湊合著看吧
c(n,m) = n!/(m!*(n-m)!)
如果n和m比較大時 可能會導(dǎo)致中間超過數(shù)據(jù)范圍,不過我們可以直接用遞推也就是
c(n,m) = c(n-1,m)+c(n-1,m-1)
不過下面我們要用另外一種方法來計(jì)算這個組合
把分子和分母約掉之后就變成了
(n*(n-1)*……*(n-m+1))/m!
這樣上面和下面都是m個元素,我們可能會想到乘1個除1個,這樣來避免越界,可是這樣會剛好整除嗎?不會出現(xiàn)小數(shù)使得最后的答案變錯嗎?其實(shí)只要我們按照一定的順序來乘和除的話,是不會產(chǎn)生小數(shù)的,也就是說會一直整除的.下面給出我的簡單證明,如有錯誤,還請指出(這個公式是借的這位博主的)
首先我們把上面那個分?jǐn)?shù)寫成這樣的
(n*(n-1)*……*(n-m+1))/(m*(m-1)*……*1)
這樣的話就相當(dāng)于n–>m  (n-1)—>(m-1) …… (n-m+1)—>1
下面先給出主要程序吧
f = 1;//最后答案
for(i = 1;i <= m;i++)
  f = f*(i+(n-m))/i;
現(xiàn)在主要的是要說明每次乘以(i+(n-m))然后再除以i不會產(chǎn)生小數(shù),我是這么想的,說先i是1,肯定不會有小數(shù),然后i=2,但是分母已經(jīng)乘過兩個數(shù)了,肯定有一個奇數(shù),一個偶數(shù),也不會產(chǎn)生小數(shù),同理3的時候也不會,但是4的時候可能會這樣想,前面某個數(shù)k整除4,那已經(jīng)別2除掉了一個2,這樣會不會產(chǎn)生小數(shù)呢?結(jié)果是不會的,因?yàn)?個相當(dāng)于2個2,或者1個4,我們可以把除2的那個選擇到這4個當(dāng)中不能出4的那一個數(shù)上,這樣的話,就剩下了一個能整除4的了,然后其他的就和這里一樣了。



Klion 2010-09-16 23:22 發(fā)表評論
]]>
Fibonacci Nim的簡單分析http://m.shnenglu.com/klion/archive/2010/09/10/126318.htmlKlionKlionFri, 10 Sep 2010 06:41:00 GMThttp://m.shnenglu.com/klion/archive/2010/09/10/126318.htmlhttp://m.shnenglu.com/klion/comments/126318.htmlhttp://m.shnenglu.com/klion/archive/2010/09/10/126318.html#Feedback0http://m.shnenglu.com/klion/comments/commentRss/126318.htmlhttp://m.shnenglu.com/klion/services/trackbacks/126318.html轉(zhuǎn)載請注明出處:http://www.klion.0fees.net/?p=29

Fibonacci Nim是如下一種游戲

一堆石子有n顆.兩人按如下規(guī)則輪流取一定的石子。

1.第一個取的至少取1顆,至多取n-1顆

2.每次取的石子數(shù)不能超過對手剛?cè)〉?倍,最后取完的算贏家。

現(xiàn)在我們需要算出對于某個n,是先手必勝,還是后手必勝。看到題目,基本也就想到一二了,肯定和Fibonacci數(shù)列有關(guān),確實(shí)。不過怎么個有關(guān)法呢?相信只要你動手算幾個小數(shù),就會猜出來了,對于n = Fi先手一定必?cái)?否則先手必勝。好了,下面我們就來證明這個結(jié)論吧:

首先我們會用到如下三個性質(zhì):

I.若K >= N,則狀態(tài)(N,K)必勝(在這里我們用(N,K)表示還剩下N顆石子,最多能取K顆石子的一個狀態(tài))

II.若狀態(tài)(N,N-1)先手必?cái)?那么狀態(tài)(N,K)(K<N)必?cái) ?/p>

III.若狀態(tài)(N,K)(K<N)則最后一次取走的石子數(shù)不超過2*N/3

下面證明(Fi,K)(K<Fi)必?cái)?/p>

一.F1(=2),F2(=3)顯然成立.

二.若F1至Fi成立,則F(i+1)成立

設(shè)先手取K顆石子。

  1).若K>=F(i-1),后手得到狀態(tài)(N-K,2*K)(N=F(i+1)),2*K>=2*F(i-1)>F(i-1)+F(i-2)=F(i)>N-K.所以后手必勝,也就是先手必?cái) ?/p>

 2).若K <= F(i-1)

    我們可知(F(i-1),K)必?cái)?假設(shè)得到的),所以后手可以使先手達(dá)到(F(i),X)(X < F(i))狀態(tài)

  由性質(zhì)III可得X <= (2*F(i-1)/3)*2 = 4*F(i-1)/3 = F(i-1)+1/2*F(i-1) <= F(i-1)+F(i-2)=F(i),所以(F(i),X)必?cái) ?/p>

下面是n != F(i)

那么(N,N-1)先手必勝。這要使得后手處于<=n的最大的Fibonacci數(shù)就行,這樣就相當(dāng)于后手必輸,也就是先手必勝。



Klion 2010-09-10 14:41 發(fā)表評論
]]>
Dynamic Subtraction(博弈)http://m.shnenglu.com/klion/archive/2010/09/07/126075.htmlKlionKlionTue, 07 Sep 2010 02:47:00 GMThttp://m.shnenglu.com/klion/archive/2010/09/07/126075.htmlhttp://m.shnenglu.com/klion/comments/126075.htmlhttp://m.shnenglu.com/klion/archive/2010/09/07/126075.html#Feedback0http://m.shnenglu.com/klion/comments/commentRss/126075.htmlhttp://m.shnenglu.com/klion/services/trackbacks/126075.html轉(zhuǎn)載請注明出處:http://www.klion.0fees.net/?p=6

Dynamic subtraction.

One can enlarge the class of subtraction games by letting the subtraction set depend on the last move of the opponent.Many early example sappear in Chapter12 of Schuh(1968).Here are two other examples.(For a generalization,see Schwenk(1970).) (a)There is one pile of n chips.The ?rst player to move may remove as many chips as desired,at least one chip but not the whole pile.There after,the players alternate moving,each player not being allowed to remove more chips than his opponent took on the previous move.What is an optimal move for the ?rst player if n =44?For what values of n does the second player have a win?

題目大意: 有一堆石子,個數(shù)為n,兩個人輪流,規(guī)則如下 第一個取石子的人至少取一個,至多取n-1個。之后每個人不能比前一個人剛?cè)∵^的石子數(shù)多.沒得取了算輸,

對于這個我們對比較小的n歸納可知,如果n=2^k(k >=0)的話則是P態(tài),否則是N態(tài). 首先我們可以看到1是P態(tài)(先手無法取,因?yàn)椴荒苋⊥?,2是P態(tài)(只能取1個,后手取剩下的一個) 所有的奇數(shù)都是N態(tài),因?yàn)槊看稳∫粋€的話,最后只剩下1顆石子的時候一定是由先手取,所以所有的奇數(shù)是N態(tài). 如果是偶數(shù)的話,第一次取的石子數(shù)不能超過一半,而且必須取偶數(shù).如果取奇數(shù)個的話,則后手變成了N態(tài),如果取超過一半的石子數(shù)的話,那么后手可以一次取完.先手也輸了. 所以4是P態(tài) 6只能取2,然后后手達(dá)到4這個P態(tài),所以先手必輸。 下面我們證明當(dāng)n = 2^k時為P態(tài), 首先i = 0,1,2時結(jié)論成立。現(xiàn)在假設(shè)n = 2^i(i>=1)時結(jié)論成立,令j = i+1;m = 2^j; 我們知道先手第一次取的石子數(shù)一定是小于2^i次的,而且從2^j到2^i和2^i到2^j是一樣多的數(shù)目. 于是我們可以看成先手可不可能通過取走一些石子使得后手處于2^i.其實(shí)這樣是不可能的,分析如下: 我們把2^j到2^i這些數(shù)都同時減去2^i,我們得到2^i,2^i-1,……,1,0,這樣就變成了一個2^i的取石子游戲了.我們可以知道在這里先手是必輸?shù)?本文如沒有特殊說明,則意味著兩個選手都按最優(yōu)的方案執(zhí)行)。首先我們得到2^(i-1)次,如果先手取的石子數(shù)比這個多的話,那么后手可以取走一定的數(shù)目使得先手處于2^i這個P態(tài).也就是說先手必輸,如果先手取走的數(shù)目比2^(i-1)少的話,那么可以得到取完2^j到2^i+1這個2^i個的時候先手也是必輸?shù)?也就是說在這個過程中后手同樣可以使得先手處于2^i這個P態(tài),這樣的話先手必輸,所以無論先手怎樣取石子,對于n=2^k(k>=0)必輸。 這樣的話,易知對于n != 2^k(k>=0)的先手必勝。



Klion 2010-09-07 10:47 發(fā)表評論
]]>
HDU 1849&2188 博弈http://m.shnenglu.com/klion/archive/2010/09/02/125643.htmlKlionKlionThu, 02 Sep 2010 07:14:00 GMThttp://m.shnenglu.com/klion/archive/2010/09/02/125643.htmlhttp://m.shnenglu.com/klion/comments/125643.htmlhttp://m.shnenglu.com/klion/archive/2010/09/02/125643.html#Feedback0http://m.shnenglu.com/klion/comments/commentRss/125643.htmlhttp://m.shnenglu.com/klion/services/trackbacks/125643.html1849:這題可以變成和上一篇中的第一種取火柴游戲一樣,也就是取最后一次的勝利,然后把每個棋子所在的坐標(biāo)看成這堆火柴的數(shù)目,接下來就是直接套用上一篇的講解了,代碼簡短。而且不易錯。

Klion 2010-09-02 15:14 發(fā)表評論
]]>
HDU_1907&2509 博弈http://m.shnenglu.com/klion/archive/2010/08/27/124932.htmlKlionKlionFri, 27 Aug 2010 04:55:00 GMThttp://m.shnenglu.com/klion/archive/2010/08/27/124932.htmlhttp://m.shnenglu.com/klion/comments/124932.htmlhttp://m.shnenglu.com/klion/archive/2010/08/27/124932.html#Feedback0http://m.shnenglu.com/klion/comments/commentRss/124932.htmlhttp://m.shnenglu.com/klion/services/trackbacks/124932.html這篇博文這學(xué)了HDU1907的解法
下面說下我的理解,有些借鑒原博文。

這題和下面的題有點(diǎn)相似,但是又不一樣
也就是說把最后取完的定為輸家改成,最后取完的定為贏家。
后面的這個要簡單一點(diǎn),下面是簡單分析,先來看這個簡單的
首先我們用T表示當(dāng)前狀態(tài)的所有火柴數(shù)異或?yàn)?,否則極為S。
1.S可以轉(zhuǎn)化成T
我們設(shè)一共有n堆火柴,每堆有k(i)根.
那么S態(tài)中k(1)^k(2)^……^k(n) != 0,這個值我們記為c
那么肯定有某個k(i)的最高位和c的最高位同為1,不然c的最高位變成了0
假設(shè)這個最高位和c的最高位同為1的是第m堆,這樣我們可以得到x = k(m)^c < k(m)(x的最高位為0)
k(1)^k(2)^……^x^……^k(n)
=k(1)^k(2)^……^k(m)^c^……^k(n)
=k(1)^k(2)^……^k(m)^k(m+1)^……^k(n)^(k(1)^k(2)^K(3)^……^k(n))
= 0
這樣我們只要從第m堆中取出k(m)-x根火柴,那么剩下的就變成了T態(tài)。
2.T一定會轉(zhuǎn)化成S
假設(shè)T不轉(zhuǎn)化成S,
我們從第m堆中取出一定的火柴數(shù)那么我們得到
0 = k(1)^k(2)^……^k(m)^……^k(n)
0 = k(1)^k(2)^……^k(m')^……^k(n)(k(m)表示取之前的 k(m')表示取最后的)
那么我們得到k(m)^k(m')=0也就是說k(m)==k(m')矛盾。
3.S態(tài),只要方法得當(dāng)就可以取勝
每一個S態(tài)可以轉(zhuǎn)化成T態(tài),然后每一個T態(tài)必然轉(zhuǎn)化成S態(tài),所以每一次只要把S態(tài)變成T態(tài),那么對手就只能把T態(tài)變成S態(tài),這樣自己就一直控制著S態(tài),最后一定可以取完(變成T態(tài))成為勝利者
4.T態(tài),只要對手方法得當(dāng)就必輸
同3
下面我們來看看該題的思路
我們設(shè)只有一根火柴的堆為單根堆,否則為充裕堆,充裕堆>=2的T用T2表示,全是單根堆的T用T0表示(沒有T1)
同樣的充裕堆>=2的S用S2表示,全為單根堆的S用S0表示,只有一堆充裕堆的用S1表示
5.S0必?cái)?T0必勝
每次自己取奇數(shù)堆的,那么最后一堆一定由自己取.T0必勝同理
6.S1只要方法得當(dāng),必勝
如果單根堆的堆數(shù)為偶數(shù),那么把充裕堆中取成只剩下1根,變成S0,對手必?cái)?如果單根堆的堆數(shù)為奇數(shù),那么把充裕堆全取完,同樣對手必?cái)?br>7.S2不可以一次轉(zhuǎn)化到T0
每次最多只能取完一堆,所以2堆充裕堆不可能一次就沒了
8.S2可以一次變成T2
用1可知S可以變成T,由7可知S不可一次變成T0,所以S可以一次變成T2
9.T2不可以一次變成S0
同7
10.T2一定變成S1或者S2中的一種
由2知T一定變成S,由9知T2不可一次變成S0,所以一定變成S1或S2中的一種
11.S2,只要方法得當(dāng)一定勝
S2可以變成T2,然T2一定變成S1或者S2,如果變成S1,已勝,變成S2,則繼續(xù),直到T2只能變成S1為止。
12.T2,只要對手方法得當(dāng)必輸
同11
綜上所述先手必勝態(tài)為T0 S2 S1
必輸態(tài)為S0 T2

到這這兩題就可以輕松搞定了。

Klion 2010-08-27 12:55 發(fā)表評論
]]>
三種簡單博弈問題的簡單介紹http://m.shnenglu.com/klion/archive/2010/08/25/124698.htmlKlionKlionWed, 25 Aug 2010 09:12:00 GMThttp://m.shnenglu.com/klion/archive/2010/08/25/124698.htmlhttp://m.shnenglu.com/klion/comments/124698.htmlhttp://m.shnenglu.com/klion/archive/2010/08/25/124698.html#Feedback2http://m.shnenglu.com/klion/comments/commentRss/124698.htmlhttp://m.shnenglu.com/klion/services/trackbacks/124698.html

  下面我們以一種游戲的方式來引進(jìn)三種基本的博弈問題。

一.巴什博奕(Bash Game):

首先我們來玩一個比較古老的報(bào)數(shù)游戲。AB一起報(bào)數(shù),每個人每次最少報(bào)一個,最多報(bào)4個。輪流報(bào)數(shù),看誰先報(bào)到30.

如果不知道巴什博弈的可能會覺得這個是個有運(yùn)氣成分的問題,但是如果知道的人一定知道怎樣一定可以贏。

比如A先報(bào)數(shù)的話,那么B一定可以贏(這里假定B知道怎么正確的報(bào)數(shù))

B可以這樣報(bào)數(shù),每次報(bào)5-k(A)個數(shù),其中k(A)A報(bào)數(shù)的個數(shù)這樣的話沒一次

兩人報(bào)完數(shù)之后會變成5 10 15 20 25 30這樣是不是B一定會贏呢?是不是有一種被欺騙的感覺呢?好吧下面我們來看看這個原理。我們先看下一個一眼就能看出答案的例子 比如說我們報(bào)到5(4+1),每次報(bào)最多報(bào)4,最少報(bào)1.那么是不是后者一定可以贏呢?答案是肯定的。好了到這巴什博弈的精髓基本就OK了。

那么如果我們要報(bào)到n+1,每次最多報(bào)n,最少報(bào)1個的話,后者一定能夠贏。

現(xiàn)在我們需要報(bào)數(shù)到n,而每次最多報(bào)數(shù)m,最少報(bào)數(shù)1.我們可以化成這樣

n = k*(1+m)+r(0 <= r <= m)這樣的話如果r不等于0那么先手一定會贏,為什么呢?首先先手報(bào)r,那么剩下k(1+m)個數(shù),那么我們每次報(bào)數(shù)1+m-k(B)個數(shù)就一定能保證最后剩下1+m,那么就到了上面我們說的那個了,先手就一定會贏,如果r=0那么后手一定會贏,道理一樣的。

到這巴什博弈也就介紹完了,知道這個道理之后我們也可以去騙小朋友了。-_-//

二.威佐夫博奕(Wythoff Game):

   這種博弈比前面一種要稍微復(fù)雜一點(diǎn)。我們來看下下面這個游戲。

   有兩堆火柴棍,每次可以從某一堆取至少1根火柴棍(無上限),或者從兩堆取相同的火柴棍數(shù)。最后取完的是勝利者。好了,如果你不知道這個博弈定理,對于小數(shù)目的火柴棍數(shù),可能還能推出來,但是如果火柴棍數(shù)一多,就不行了。看了下面的這個介紹,你也會有一種被騙的感覺。

   首先我們知道兩堆火柴是沒有差別的,也就是說第一堆有a,第二堆有b根和第一堆有b,第二堆有a根是一樣的結(jié)果。

   我們用一個二維的狀態(tài)(a,b)來記錄當(dāng)前剩下的火柴數(shù),表示第一堆剩下a根火柴,第二堆剩下b根火柴。同樣我們假設(shè)兩個人的編號是AB,且A先取。

那么如果某個人遇到了這樣的狀態(tài)(0,0)那么也就是說這個人輸了。這樣的狀態(tài)我們叫做奇異狀態(tài),也可以叫做失敗態(tài)。

那么接下來的幾個失敗態(tài)為(1,2),(3,5),(4,7),(6,10),(8,13)……

我們用a[i]表示失敗態(tài)中的第一個,b[i]表示失敗態(tài)中的第二個.(i0開始).

那么我們可以看到b[i] = a[i]+i;i >= 0,a[i]是前面的失敗態(tài)中沒有出現(xiàn)過的最小的整數(shù)

下面我們可以得到三個基本的結(jié)論。

  1.每個數(shù)僅包含在一個失敗態(tài)中

  首先我們知道a[k]是不可能和前面的失敗態(tài)中的a[i],b[i]重復(fù)的(這點(diǎn)由a[i]的得到可以知道)

b[k] = a[k]+k > a[k-1]+k>a[k-1]+k-1+1>a[k-1]+(k-1) = b[k-1]>a[k-1]這樣我們知道每個數(shù)僅在一個失敗態(tài)中。

  2.每個失敗態(tài)可以轉(zhuǎn)到非失敗態(tài)。

 加入當(dāng)前的失敗態(tài)為(a,b),那么如果我們只在一堆中取的話,肯定會變成非失敗態(tài)(這點(diǎn)由第一點(diǎn)可以保證),如果從兩堆同時取的話,由于每個失敗態(tài)的差是不一樣的,所以也不可能得到一個失敗態(tài)。也就是說一個失敗態(tài)不管你怎么取,都會得到一個非失敗態(tài)。

   3.每個非失敗態(tài)都可以轉(zhuǎn)到一個失敗態(tài)

對于這個結(jié)論,首先我們要知到每個狀態(tài)(a,b)要么a = a[i],要么b = b[i].(每個數(shù)都出現(xiàn)在一個失敗態(tài)中),下面我們分兩種情況來討論

   I.a = a[i].如果b = a的話那么一次取完就變成了(0,0).如果b > b[i]的話,那么我們從第二堆中取走b-b[i]就變成了一個失敗態(tài)。如果b < b[i].那么我們從兩堆中同時取走a-a[b-a[i]]這樣得到失敗態(tài)(a[b-a[i]],a[b-a[i]]+b-a[i])(a[i] = a)

   II.b = b[i].如果a > a[i]那么我們從第一堆中取走a-a[i]根火柴.

              如果a < a[i].這里又分兩種情況。第一是a = a[k](k < i)

那么我們從第二堆取走b - b[k]就行了。

第二是a = b[k]這樣的話由于兩堆火柴是沒有區(qū)別的,所以我們把b變成a[k]就行了,也即是從第二堆火柴中取走b - a[k]就變成了失敗態(tài)

至于怎么判斷一個狀態(tài)是否是失敗態(tài).我們可以用下面的方法來判斷(本人暫時還不會證明)

  a[i] = [i*(1+5)/2](這里的中括號表示向下取整)   b[i] = a[i]+i;

  那么這就是一個失敗態(tài),

 看了這之后可以去找POJ1067練練手

三.尼姆博奕(Nimm Game):

  這個已經(jīng)變成了三堆火柴了。每次只能從某一堆取任意個(至少為1),最后取完的為勝利者。

  這個博弈我們用三維的狀態(tài)來表示(a,b,c).對于每個失敗態(tài)我們有a^b^c = 0至于為什么我暫時不會證(記得陳景潤的一本組合數(shù)學(xué)中有證明,后面要是懂了再來補(bǔ)吧)

  對于一個非失敗態(tài)我們可以通過轉(zhuǎn)換得到一個失敗態(tài),也就是說(a,b,c)我們可以通過如下的操作得到一個失敗態(tài),如果a^b < c那么我們從第三堆中取走c-a^b,如果a^c < b那么我們從第二堆中取走b - a^c.如果b^c < a那么我們從第一堆中取走a - b^c根。這樣就變成了一個失敗態(tài)。

由于水平有限,暫時只能寫這么多了。



Klion 2010-08-25 17:12 發(fā)表評論
]]>
sgu 249http://m.shnenglu.com/klion/archive/2010/05/18/115704.htmlKlionKlionTue, 18 May 2010 09:45:00 GMThttp://m.shnenglu.com/klion/archive/2010/05/18/115704.htmlhttp://m.shnenglu.com/klion/comments/115704.htmlhttp://m.shnenglu.com/klion/archive/2010/05/18/115704.html#Feedback0http://m.shnenglu.com/klion/comments/commentRss/115704.htmlhttp://m.shnenglu.com/klion/services/trackbacks/115704.htmlMatrix67大牛的位運(yùn)算4則(還只看到第3則),看到這,大牛推薦的。
然后就做了下,不過建議先自己理解,別看大牛給的程序,
 這個題是二維的格雷碼,把兩個合并起來。
題意是02^(n +m)-1的數(shù)寫成2^n * 2^m的矩陣,使得位置相鄰兩數(shù)的二進(jìn)制表示只有一位之差
這樣的話就是把n位的格雷碼和m位的格雷碼合并起來就行了
n = 1 m = 2來說吧
可以自己先窮舉一下會發(fā)現(xiàn)時下面的樣子
 
000(0)
100(4)
110(6)
010(2)
001(1)
101(5)
111(7)
011(3)
可以發(fā)現(xiàn)各列的前兩位是一樣的,也是m位的gray(其實(shí)先把所有列合并起來,然后再在后面加上ngray就成了這個了)
這樣的話,實(shí)現(xiàn)起來就比較容易了
代碼如下(第n個gray碼是n ^ (n >> 1)(其中n從0開始))





for(x = 0;x < 1<<n;x++)
    {
//列的gray  就可以把一行搞成幾行
       u = (x ^ (x >> 1));//計(jì)算n位的gray
    for(y = 0;y < 1<<m;y++)
       {
//計(jì)算m位的gray
             t = (y ^ (y >> 1)) << n;//移位,這里就是左移一位
             printf("%d ",(u | t));//輸出,由于這里的不會出現(xiàn)進(jìn)位,所以可以用加
        }
       printf(
"\n");
    }




Klion 2010-05-18 17:45 發(fā)表評論
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品高潮呻吟久久| 欧美成年人视频网站| 亚洲裸体在线观看| 欧美高潮视频| 亚洲日韩成人| 亚洲国产99| 日韩五码在线| 亚洲欧美国产va在线影院| 欧美一区久久| 欧美va亚洲va日韩∨a综合色| 欧美一区成人| 久久国产精品免费一区| 亚洲日本va午夜在线影院| 亚洲国内精品| 亚洲一区成人| 免费久久精品视频| a91a精品视频在线观看| 欧美一区二区私人影院日本| 久久久亚洲欧洲日产国码αv| 一区二区av| 欧美一区二区三区的| 亚洲一区二区免费看| 欧美成人dvd在线视频| 久久久精品国产99久久精品芒果| 91久久精品国产91性色tv| 国产日韩欧美在线视频观看| 亚洲国产成人不卡| 狠狠色丁香婷婷综合久久片| 亚洲精品国产精品乱码不99按摩 | 久久久久女教师免费一区| 久久一区亚洲| 国产欧美日本在线| 亚洲免费观看| 日韩一区二区久久| 欧美一区午夜精品| 亚洲精选一区| 蜜臀a∨国产成人精品| 国产女主播一区二区三区| 亚洲麻豆av| 欧美大片免费观看| 久久精品在线免费观看| 国产精品欧美日韩一区| 国产精品一区久久久| 国产精品久久久久999| 亚洲国产精品热久久| 亚洲精品在线一区二区| 久久精品国产亚洲aⅴ| 一区二区三区 在线观看视频| 99精品国产热久久91蜜凸| 快she精品国产999| 伊人久久大香线| 久久偷看各类wc女厕嘘嘘偷窃| 免费久久精品视频| 欧美一区二区三区的| 国产日韩av一区二区| 国产精品久久999| 国产精品女人毛片| 国产午夜一区二区三区| 国产一区二区三区四区在线观看| 国产一区视频观看| 欧美亚洲一区二区在线观看| 一区二区三区免费观看| 欧美日韩大片一区二区三区| 亚洲免费高清视频| 日韩网站在线观看| 国产精品免费网站在线观看| 亚洲欧美日韩一区二区三区在线观看| 久久国内精品视频| 亚洲伊人伊色伊影伊综合网| 国产精品毛片a∨一区二区三区| 国产欧美欧洲在线观看| 欧美一区二区三区免费观看| 小处雏高清一区二区三区 | 性欧美xxxx视频在线观看| 一区二区精品在线观看| 国产精品久久久久久久电影| 欧美一级视频| 久久久之久亚州精品露出| 亚洲国产日韩在线| 日韩视频在线你懂得| 久久国产精品亚洲77777| 欧美二区乱c少妇| 99精品欧美一区二区三区综合在线| 亚洲欧美成人综合| 亚洲性xxxx| 亚洲高清三级视频| 99在线精品观看| 欧美成人精品福利| 亚洲午夜免费视频| 久久精品国产2020观看福利| 亚洲精品九九| 亚洲女ⅴideoshd黑人| 欧美日韩在线三级| 欧美一区中文字幕| 欧美国产日韩免费| 欧美专区在线观看| 欧美88av| 久久激情久久| 欧美日韩另类国产亚洲欧美一级| 亚洲国产精品成人| 久久精品亚洲一区二区三区浴池 | 亚洲精品黄色| 国产日韩欧美日韩| 91久久精品一区二区别| 国产精品视频免费观看| 欧美国产免费| 久久综合网hezyo| 亚洲综合99| 欧美久久久久免费| 狠狠色狠色综合曰曰| 亚洲日本理论电影| 一区二区自拍| 欧美在线免费观看亚洲| 免费人成精品欧美精品| 国内不卡一区二区三区| 亚洲精品美女在线观看| 欧美国产日韩一区二区在线观看 | 日韩写真视频在线观看| 狠狠色综合色区| 亚洲自拍偷拍福利| 在线一区二区三区四区| 在线午夜精品自拍| 亚洲免费电影在线| 中文有码久久| 日韩午夜激情av| 欧美成人日韩| 欧美福利在线| 亚洲国产欧美一区二区三区同亚洲 | 国产亚洲精品成人av久久ww| 亚洲精品美女免费| 一本色道久久99精品综合| 欧美成人精品在线播放| 女人色偷偷aa久久天堂| 在线播放中文字幕一区| 欧美中文在线视频| 久久精品青青大伊人av| 国内精品视频久久| 久久露脸国产精品| 麻豆国产va免费精品高清在线| 久久久免费观看视频| 久久精品夜色噜噜亚洲a∨| 免费在线成人av| 蜜臀久久99精品久久久久久9 | 免费观看一级特黄欧美大片| 久久亚洲私人国产精品va| 国内精品国语自产拍在线观看| 欧美成人精品1314www| 欧美日韩第一区日日骚| 亚洲精品一区久久久久久| 中文欧美日韩| 国产精品视频一区二区高潮| 欧美夜福利tv在线| 暖暖成人免费视频| 99精品视频免费在线观看| 欧美视频精品在线| 欧美在线精品免播放器视频| 亚洲色图自拍| 国产精品一区二区三区成人| 久久精品中文| 亚洲精品裸体| 久久国产精品久久精品国产| 在线观看亚洲| 欧美日产一区二区三区在线观看| 久久久免费观看视频| 精品91久久久久| 欧美日韩1234| 校园春色国产精品| 亚洲国产精品成人综合| 亚洲女人小视频在线观看| 欧美v日韩v国产v| 日韩一区二区精品在线观看| 红桃视频成人| 欧美国产91| 欧美亚洲综合在线| 亚洲精品欧美极品| 亚洲精品少妇| 国产精品欧美久久| 美日韩在线观看| 亚洲欧美在线一区二区| 亚洲国产精品va在线观看黑人| 在线成人www免费观看视频| 欧美日韩亚洲一区| 久久婷婷国产综合精品青草| 亚洲一区二区成人| 亚洲清纯自拍| 欧美成黄导航| 久久久久久久高潮| 中文av一区特黄| 亚洲精品在线二区| 在线观看精品一区| 国产午夜亚洲精品理论片色戒| 亚洲自拍都市欧美小说| 亚洲激情影院| 美女91精品| 久久精品一区二区三区不卡牛牛| 国产亚洲成人一区| 欧美午夜精品伦理| 欧美日韩福利视频| 欧美国产精品一区| 欧美ed2k|