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 個字元除了u可以在另外25個字母中隨便填
f[i][1] = f[i - 1][0] + 25f[i - 1][1] //前i-1個字元既不含u也不含us的話,那麼第 i 個就填u,前 i-1 個字元含u不含us的話,第i個除了s之外25個字母中隨便填
f[i][2] = f[i-1][1] + 26f[i-1][2] //前i-1個字元含u不含us的話,那麼第 i 個就填s,前 i-1 個字元含us的話,第i個可以在26個字母中隨便填
初始化:f[1][0] = 25,f[1][1] = 1,f[1][2] = 0;
**:
#include
using
namespace std;
typedef
long
long ll;
const
int n =
1e6+
5, mod =
1e9+7;
ll n, ans;
//f[i][0]表示前i個字元沒有u的串的數量
//f[i][1]表示前i個字元有u無us的串的數量
//f[i][2]表示前i個字元有us的串的數量
ll f[n][4
];intmain()
printf
("%lld\n"
, ans)
;return0;
}
b、 括號
思路:若想使構造的括號串最短,可以先構造出乙個「((…))」的對稱符號串,該符號串中的合法括號對有k*k個(k為對稱匹配的括號對數量),然後在此基礎上插入新的半邊括號即可構成有任意對數的括號串
**:
#include
using
namespace std;
typedef
long
long ll;
ll k;
string s;
intmain()
if(t2 <= t1)
else
}return0;
}
c、紅與藍
思路:從葉節點入手,從葉節點開始,將它的顏色染成和它父親相同的顏色,如果按這個規律染完後所有的節點都染上色了,那麼就構造成功了,否則就無法構造滿足條件的染色樹
**:
#include
using
namespace std;
const
int n =
1e5+
5, m = n *2;
int n, idx, cnt;
bool flag =1;
int h[n]
, e[m]
, ne[m]
;int f[n]
, col[n]
;void
add(
int a,
int b)
void
dfs1
(int x,
int fa)
//若該節點沒有子節點或者該節點未被染色 if(
!son ||
!f[x]
)//若其父節點未被染色則給其染上相同的顏色
f[x]
= f[fa]
=++cnt;;}
}void
dfs2
(int x,
int fa)
}int
main()
dfs1(1
,0);
//若根節點未被染色或有節點沒有被染色
if(f[0]
||!flag)
//根節點染上紅色
col[1]
=1;dfs2(1
,0);
for(
int i =
1; i <= n; i++
)return0;
}
f、 對答案一時爽
思路:最小值為0,最大值為n加上兩人所選的相同選項數
**:
#include
using
namespace std;
char a[
105]
, b[
105]
;int
main()
printf
("%d 0\n"
, n + k)
;return0;
}
h、冪塔
思路:找規律/尤拉降冪(待補)
i、限制不互素對的排列
思路:重點在於題目中的 k <= n/2 ,答案就很顯然了,當k < n/2時,在前面放 k+1 個偶數即可,當 k == n/2 時,將偶數6放在最後,然後6後面接上3,後面位置從1開始按順序放沒有用過的整數即可
**:
#include
using
namespace std;
int n, k;
vector<
int> v;
set<
int> s;
intmain()
for(
int i =
1; i <= n; i++)}
return0;
}
j、一群小青蛙呱蹦呱蹦呱
思路:剩餘的數除了1以外,每個數一定可以分解為兩個或兩個以上質數相乘,求多個數的最小公倍數實際上就是求所有數**現的每個質因子的最大次方,然後相乘即可
所以先用尤拉篩篩出1 ~ n中的所有質數,然後求出每個質數在1 ~ n出現的最大次方(推公式)相乘,注意此時我們只用篩選1 ~ n/2 部分的質數即可
**:
#include
using
namespace std;
typedef
long
long ll;
const ll n =
2e8+
5, mod =
1e9+7;
ll n, k, ans =1;
ll prime[n]
;bool st[n]
;void
init
(ll m)}}
ll qpow
(ll a, ll b, ll m)
return ans;
}int
main()
if(ans ==1)
puts
("empty");
else
printf
("%lld\n"
, ans)
;return0;
}
2020牛客寒假演算法基礎集訓營第一場(補題)
題目描述 hanayo很喜歡吃公尺飯。有一天,她拿出了 個碗,第乙個碗裝了 粒公尺飯,第二個碗裝了 粒公尺飯,以此類推,第 個碗裝了 粒公尺飯。然而,愛搞惡作劇的rin把所有的碗的順序打亂,並拿走了乙個碗。hanayo想知道,rin拿走的碗裡有多少粒公尺飯?輸入描述 第一行輸入乙個正整數 代表原始的...
2023年牛客寒假集訓營第五場題解
c 石子遊戲 思路 利用差分陣列將區間修改轉化為兩個端點處的單點修改,按照每次新增乙個長度為 k 的區間的規則,首先從左到右將所有點補到該點左邊比它高的點的高度,再從右到做將所有點補到該點右邊比它高的點的高度,最後特判一下第 n k 1 個點 因為差分時以該點為左端點的區間右端點無法判斷 然後如果能...
2023年牛客寒假集訓營第二場題解
d 牛牛與整除分塊 思路 整數分塊有乙個性質,對於乙個整數n,當k n sqrt n 1 時,每個 n k 都是不同的,否則看n k是幾,然後利用對稱軸x n sqrt n 對稱過來 圖源自出題人 f 牛牛與交換排序 思路 如果有解的話k值一定是唯一的,那麼先確定k值,然後判斷這個k值是否可行。手寫...