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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

FZYZ-2071 A Simple Math Problem IX

發(fā)布時(shí)間:2024/1/17 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FZYZ-2071 A Simple Math Problem IX 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P2071 -- A Simple Math Problem IX

時(shí)間限制:1000MS ???? 內(nèi)存限制:262144KB

狀態(tài):Accepted ???? 標(biāo)簽: ???數(shù)學(xué)問(wèn)題-博弈論???無(wú)???無(wú)

Description

給定a,b,n,保證a≥2,b≥1,a^b≤n。兩個(gè)人在玩游戲,每個(gè)人每次可以把a(bǔ)加1,或者把b加1,但是不能違反a^b<=n,無(wú)法再進(jìn)行操作的人就輸?shù)袅诉@一場(chǎng)游戲。

假設(shè)兩個(gè)人都足夠聰明,按照最優(yōu)策略進(jìn)行游戲,問(wèn)先手是否有必勝策略。

Input Format

第一行兩個(gè)正整數(shù) n 和 m。

接下來(lái) m 行,每行兩個(gè)正整數(shù) a 和 b。保證 a≥2,b≥1,a^b≤n。

Output Format

m 行,如果對(duì)于這一對(duì)數(shù)字 a 和 b,如果先手有必勝策略,輸出 “Yes”。否則輸出 “No” (不含引號(hào))

Sample Input

5 3 2 1 2 2 3 1

Sample Output

Yes No No

Hint

對(duì)于10%的數(shù)據(jù),n=2

對(duì)于70%的數(shù)據(jù),n<=1000

對(duì)于100%的數(shù)據(jù),n<=10^9,m<=10^5

?

題解

????? 不難想到,狀態(tài)(a,b)可以轉(zhuǎn)移到狀態(tài)(a + 1, b)或者(a, b + 1)。設(shè)F[a][b]為該局面下先手勝敗,1表示必勝,0表示必?cái)?#xff0c;那么F[a][b] = (F[a + 1][b] & F[a][b +1]) ^ 1。但是數(shù)據(jù)范圍太大,該怎么辦呢?

????? 首先,a和b必須滿(mǎn)足a^b <= n,即log (a, n) >= b,又因?yàn)閍 >= 2,所以log (2, n) >= log(a, n),所以b <= log (2, n) <= 30。

????? 其次,a^b <= n還可以推出當(dāng)b >= 2時(shí),a <= sqrt(n),這也是一個(gè)不大的數(shù)字。當(dāng)b=1時(shí),即便n很大,但隨著a的遞增,可供選擇的b會(huì)逐漸減少,最后轉(zhuǎn)移會(huì)變成一條鏈,所以根據(jù)奇偶性判斷就好。

?

代碼

?

1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 #define MAXN 50010 6 #define MAXM 50 7 using namespace std; 8 9 int N, M; 10 int j; 11 long long X; 12 int A, B; 13 int Lim; 14 bool F[MAXN][MAXM]; 15 16 char ch; int aa, bb; 17 int Scan() { 18 while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-'); 19 ch=='-' ? (bb=1,aa=0) : (aa=ch-48,bb=0); 20 while(ch=getchar(),ch>='0'&&ch<='9')aa=aa*10+ch-48; 21 if(bb)aa=-aa; 22 return aa; 23 } 24 25 int main() { 26 memset(F, 1, sizeof(F)); //F必須開(kāi)bool 27 N = Scan(); 28 Lim = int (sqrt(N)); 29 if ((Lim + N) & 1) F[Lim + 1][1] = 0; 30 for (int i = Lim; i >= 2; --i) { 31 for (j = 0, X = 1; X <= N; X *= i, ++j); //X可能會(huì)爆int 32 for (--j; j; --j) F[i][j] = (F[i + 1][j] & F[i][j + 1]) ^ 1; 33 } 34 for (M = Scan(); M; --M) { 35 A = Scan(); B = Scan(); 36 if (B == 1 && A > Lim) { 37 if ((N + A) & 1) printf("Yes\n"); 38 else printf("No\n"); 39 } 40 else { 41 if (F[A][B]) printf("Yes\n"); 42 else printf("No\n"); 43 } 44 } 45 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/DonMaestro/p/4324207.html

總結(jié)

以上是生活随笔為你收集整理的FZYZ-2071 A Simple Math Problem IX的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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