日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces - 603C Lieges of Legendre(博弈+找规律)

發(fā)布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 603C Lieges of Legendre(博弈+找规律) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:首先給出n堆石子和一個k值,兩人輪流按照規(guī)則操作,不能操作的一方即為失敗,每一次都有兩種操作:

  • 從任意一堆石子中取走一個石子
  • 任選一堆偶數(shù)個的石子,將其轉(zhuǎn)換成k堆x/2的石子
  • 兩人都會按照最優(yōu)解操作,問誰能贏得游戲

    題目分析:我們可以將n堆石子都看成一個獨立的游戲,那么這個題目就轉(zhuǎn)換成了求每一堆石子的sg函數(shù)然后異或判斷結(jié)果,但這里遇到了兩個問題,首先這個題目不是常規(guī)的sg打表,其次每一堆石子的數(shù)目達到了1e9,打表是不太現(xiàn)實的

    我們可以先打個表看一下前幾項規(guī)律,看了網(wǎng)上大部分的博客都沒有教怎么打表找規(guī)律,昨天我問了問我隊友,確實挺簡單的,但我不會。。現(xiàn)在可算是會了

    先簡單分析一下,不難看出,若這個sg函數(shù)主要取決于k的奇偶,若k為奇數(shù),那么除了一堆之外,其他的都能互相抵消掉,若k為偶數(shù),那么所有新生成的堆數(shù)都能互相抵消,有了這個結(jié)論,我們就能得出sg函數(shù)的大體框架了:

    sg函數(shù):

    const int N=100;//打表打到多少int sg[N];bool mex[10];void get_sg() {sg[0]=0;for(int i=1;i<N;i++){memset(mex,false,sizeof(mex));if(i&1)mex[sg[i-1]]=true;else{if(k&1){mex[sg[i-1]]=true;mex[sg[i/2]]=true;}else{mex[sg[i-1]]=true;mex[sg[0]]=true;}}for(int j=0;j<10;j++)if(!mex[j]){sg[i]=j;break;}} }

    然后我們就可以找規(guī)律了,我們可以輕易的看出,當x為較大的奇數(shù)時(大于3的奇數(shù)),sg函數(shù)值都是0,即為必敗態(tài),那么在處理偶數(shù)時,只需要關(guān)注其除以2的sg函數(shù)值即可,因為若其能直接到達奇數(shù)態(tài)時,那么其sg的值必為1,就可以直接返回了

    當x為偶數(shù)時,就要根據(jù)k的奇偶來判斷了,一開始我以為sg函數(shù)值和x中有2的冪次有關(guān)系,后來發(fā)現(xiàn)不太對,自己觀察(去網(wǎng)上搜題解)后得出,因為k為偶數(shù)時對結(jié)果沒有影響,所以x的sg值都為1,當k為奇數(shù)時,就要判斷x/2的sg值了,一直往前遞歸,就能根據(jù)前面的值推出當前的值了,大概的一個邏輯就是:

  • 當前項的sg值為0,后續(xù)項的sg值為1(mex函數(shù)的定義)
  • 當前項的sg值為1,后續(xù)項的sg值為2(因為sg(x)=mex{sg(x-1),sg(x/2)},其中上文已經(jīng)提到過,所有大奇數(shù)的sg值都是0,此時的x-1正是奇數(shù),所以0已經(jīng)被占了,若1也被占了,根據(jù)mex函數(shù)的定義,當前的sg值就只能是2了)
  • 當前項的sg值為2,后續(xù)項的sg值為1(mex函數(shù)的定義,同上一條的道理一樣,若0和2都被占了,那么當前sg的值就是1了)
  • 這個邏輯結(jié)合上面提到的sg函數(shù)的邏輯就很好理解了,如果實在不行,或者找規(guī)律技術(shù)屬實強大,那么可以直接找規(guī)律看出來

    實現(xiàn)代碼:

    #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;int k; /* 當k為偶數(shù): 0:0 1:1 2:2 從3開始: 奇數(shù):0 偶數(shù):1當k為奇數(shù): 0:0 1:1 2:0 3:1 4:2 奇數(shù):0 偶數(shù):與x/2的sg有關(guān):x/2=2或x/2=0:1x/2=1:2 */ int get_sg(int x) {if(k&1){if(x<5){if(x==0)return 0;else if(x==1)return 1;else if(x==2)return 0;else if(x==3)return 1;else if(x==4)return 2;}else{if(x&1)return 0;elsereturn get_sg(x/2)==1?2:1; }}else{if(x<=2)return x;elsereturn (x&1)^1; } }int main() { // freopen("input.txt","r",stdin);int n;scanf("%d%d",&n,&k);int ans=0;while(n--){int num;scanf("%d",&num);ans^=get_sg(num);} if(ans)printf("Kevin\n");elseprintf("Nicky\n");return 0; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的CodeForces - 603C Lieges of Legendre(博弈+找规律)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。