t2讀題跪掉了好可惜 qaq
problem a:建設城市
插板加容斥搞個不停,得到柿子:$\sum \limits_ (-1) ^ c_ ^ \times c_n^i$。
預處理階乘和階乘逆元,ning幹。
1 #include 2problem a#define ll long long34
const
int d = 998244353
;5 ll n, m, k, fac[10000007], inv[10000007
], ans;67
ll qpow(ll x, ll b)
1314
void init(int
x) 19
20 ll c(int n, int
m) 23
24signed main()
30init(std::max(n, m));
31 ans += c(m - 1, n - 1
);32
for (int i = 1; i <= n; i++)
38 printf("
%lld\n
", ans %d);
39return0;
40 }
problem b:轟炸行動
讀錯題,讀成一條邊的兩邊不能同時轟炸,這肯定就可以染色嘛,獲得了10分的好成績半個機房都看錯了
真正的題意:兩點聯通就不能同時轟炸。
那我就沒話講了。tarjan跑出scc,拓撲跑個最長鏈。
1 #include 2problem b3const
int n = 10000005;4
intn, m;
5 std::vectore[n], g[n];67
intdfn[n], low[n], stk[n], tp, num, scc, val[n], pos[n], ind[n], f[n], ans;
8bool
ins[n];910
void tarjan(int
x) else
if(ins[y]) 20}
21if (low[x] ==dfn[x]) while (y !=x);28}
29}3031
void
topsort() 38}
39while (!q.empty()) 48}
49}50for (int i = 1; i <= scc; i++)
51 ans =std::max(ans, f[i]);52}
5354
signed main()
60for (int i = 1; i <= n; i++)
63for (int x = 1; x <= n; x++) 69}
70}71topsort();
72 printf("
%d\n
", ans);
73return0;
74 }
problem c:石頭剪刀布
20分特判必拿。感覺像是能狀壓,但搞了半天搞不出來,感覺不可做,和ai下五子棋。
題解過於諤諤,n那麼小不是沒原因的(
設f[i][j][k][l]為i+j+k步i個石頭j個剪刀k個布,下一步為l的概率。然後就發現不可求。
再開乙個輔助陣列g[i][j][k]表示i+j+k步i個石頭j個剪刀k個布的概率。
g的轉移:$g[i][j][[k] += g[i-1][j][k] * r[t] + g[i][j-1][k] * s[t] + g[i][j][k-1] * p[t]$。
利用g可以把f也轉移了:$f[i][j][k][l] += f[i-1][j][k][l]*r[t]+f[i][j-1][k][l]*s[t]+f[i][j][k-1][l]*s[t]+g[i][j][k]*(r[t]+p[t]+s[t])$.
到這裡使勁想想還是能想出來的,但此時發現看不懂std。orz
std最主要看不懂的就是那個第5層迴圈。其實是這樣的。
首先std沒有開g,直接用f[0]當g用。我們要求f[i][j][k][l],首先要先從之前的狀態把已有概率繼承,柿子的前半段就是在幹這個。
if (x) f[j][k][l][x] += f[j][k][l][0] *qaq[i][x]這一行只有j+k+l!=i的時候才會有可能執行。它存在的意義就是用g更新狀態,是之前柿子右半部分。
if (j) f[j][k][l][x] += f[j-1][k][l][x] * qaq[i][1這三行得分成x = 0和x > 0去看。x > 0時仍然是繼承。x = 0時則是在更新g。];if (k) f[j][k][l][x] += f[j][k-1][l][x] * qaq[i][2
];if (l) f[j][k][l][x] += f[j][k][l-1][x] * qaq[i][3];
當j+k+l==i時,目標狀態都已經更新完畢了,這時用目標狀態給下乙個狀態更新一下g。
1 #include 2problem c3intn;4
double qaq[105][5], f[60][60][60][10], c[70][70
], ans;56
signed main()
14 c[0][0] = c[1][0]= c[1][1] = 1.0;15
for (int i = 2; i <= n; i++) 20}
21 f[0][0][0][0] = 1.0;22
for (int i = 1; i <= n; i++) 32}
33}34}
35}36for (int i = 0; i < n; i++) 45}
46}47 printf("
%.12lf\n
", ans);
48return0;
49 }
NOIP模擬測試22
自 閉 賽 從這次比賽之後題都好難啊qaq 開考一小時內沒動鍵盤。三道題都不會。gg problem a 數論 過於玄學 列舉質因子,往答案裡去加。用來加入的質因子不會很多,質因子大了對答案是不優的。開兩個vector來回倒騰就完了 這題改完感覺也沒啥,為啥考場上就是想不出來啊qxq 1 inclu...
NOIP模擬測試20
liu runda聚聚的饋贈 problem a 周 防自閉題?這道題讓我整個考試都很愉悅 搜就完事了 1 include 2 3intn 4 int a 20 b 20 c 20 d 20 5 long long ans 67 void dfs int day,long long oi,long ...
NOIP模擬測試23
這次考試又一次暴露了我很大的問題。首先做的比較好的是這幾次考試一分沒掛,但是,這也體現了更大的問題,那就是我的實力似乎也僅限於此了。考試先拿滿了暴力分 100 0 50 然後看了看t2沒看懂,打了個記憶化搜尋,只有10分,此時只過了不到2個小時 沒看懂題也就罷了,那真的是我菜,可是接下來,我沒有再去...