2023年牛客寒假集訓營第二場題解

2021-10-19 07:33:21 字數 2362 閱讀 7631

d、牛牛與整除分塊

思路:整數分塊有乙個性質,對於乙個整數n,當k <= n

\sqrt

n​+ 1 時,每個[n/k]都是不同的,否則看n/k是幾,然後利用對稱軸x = n

\sqrt

n​對稱過來

(圖源自出題人)

}f、牛牛與交換排序

思路:如果有解的話k值一定是唯一的,那麼先確定k值,然後判斷這個k值是否可行。

手寫乙個雙端佇列,正常情況下佇列頭進尾出,翻轉後尾進頭出,用乙個變數記錄是否翻轉的狀態

**:

#include

using

namespace std;

const

int n =

1e5+5;

int a[n]

, pos[n]

;struct deq

void

push_back

(int x)

intfront()

void

pop_front()

}q;int

main()

int k =0;

for(

int i =

1; i <= n; i++)}

if(!k)bool f =1;

q.l = n -

5, q.r = n -5;

for(

int i =

1; i <= k; i++

) q.

push_back

(a[i]);

for(

int i =

1; i <= n; i++)}

q.pop_front()

; q.

push_back

(a[i + k]);

}if(f)printf

("yes\n%d"

, k)

;else

puts

("no");

return0;

}

h、牛牛與棋盤

思路:簽到。。。

**:

#include

using

namespace std;

intmain()

printf

("\n");

}return0;

}

i、牛牛的「質因數」

思路:用陣列 f[i] 來表示整數 i 的質因子拼接成的數,對於每個質因子,若其是質數,則可以將n以內所有 i

ki^k

ik用 k 個 i 表示存起來,對於不是 i

ki^k

ik但是 i 的倍數可以將質因子 i 先加入這個數,後面再加入其它的質因子

列出狀態轉移方程:f[j] = (f[j/i] * fun(i)) + i (其中 j 為 n 以內 i 的倍數)

**:

#include

using

namespace std;

typedef

long

long ll;

const

int n =

4e6+

5, mod =

1e9+7;

int n;

ll ans;

ll f[n]

;int

fun(

int q)

intmain()

}for

(int i =

2; i <= n; i++

) ans =

(ans + f[i]

)% mod;

cout << ans <<

"\n"

;return0;

}

j、牛牛想要成為hacker

思路:前面用斐波那契數列填充,後面全部用1即可

**:

#include

using

namespace std;

intmain()

for(

int i =

41; i <= n; i++

) cout <<

1<<

' ';

return0;

}

2020牛客寒假演算法基礎集訓營第二場(補題)

題目描述 牛牛和 牛可樂在玩石頭剪刀布。眾所周知,石頭剪刀布的規則是這樣的 牛牛和 牛可樂進行了多輪遊戲,牛牛總共出了 a 次石頭,b 次剪刀,c 次布 牛可樂總共出了 x 次石頭,y 次剪刀,z 次布。你需要求出 牛牛最多獲勝多少局。輸入描述 第一行,三個非負整數 a,b,c 第二行,三個非負整數...

2023年牛客寒假集訓營第五場題解

c 石子遊戲 思路 利用差分陣列將區間修改轉化為兩個端點處的單點修改,按照每次新增乙個長度為 k 的區間的規則,首先從左到右將所有點補到該點左邊比它高的點的高度,再從右到做將所有點補到該點右邊比它高的點的高度,最後特判一下第 n k 1 個點 因為差分時以該點為左端點的區間右端點無法判斷 然後如果能...

2023年牛客寒假集訓營第一場題解

a 串 思路 一共n個字元,可以轉化為 i 1 i n 個字母中包含 us 的方案數之和 用 f i 2 1 0 表示前 i 個字母中 含有us 含u但不含us 既不含u也不含us 的方案數 然後可得狀態轉移方程 f i 0 25 f i 1 0 前i 1個字元不含u也不含s,那麼第 i 個字元除了...