ABC221_E: LEQ
BIT,逆元などの要素が詰まった良問,考え方は転倒数の数え方を発展させた感じ.
バグ:vectorのresizeの挙動
自作バグ:メモ再帰で関数と配列の取り違え
EDPCのJ問題,すしのやつ
https://atcoder.jp/contests/dp/tasks/dp_j
```cpp
double f(int s1,int s2,int s3){
if(seen[s1][s2][s3]) return dp[s1][s2][s3];
seen[s1][s2][s3]=true;
double res=1;
if(s1>0) res+=f(s1-1,s2,s3)*s1/n;
if(s2>0) res+=f(s1+1,s2-1,s3)*s2/n;
if(s3>0) res+=f(s1,s2+1,s3-1)*s3/n;
res/=double(s1+s2+s3)/n;
// cout << res << endl;
return dp[s1][s2][s3]=res;
}
```
と書くべきところ,関数ではなく変数を書いていた.orz
```cpp
if(s1>0) res+=dp[s1-1][s2][s3]*s1/n;
```
状態の遷移も忘れた.2枚の皿が減れば,1枚の皿が増えるという当たり前のことが分からず.配列もこのことを考えて切る必要がある.
```cpp
if(s2>0) res+=f(s1,s2-1,s3)*s2/n;
if(s3>0) res+=f(s1,s2,s3-1)*s3/n;
```
modintのコンパイルエラー
拾ってきたmodintをコンパイルオプション付きでコンパイルすると,エラーを吐く.
main.cc: In constructor ‘mint::mint(long long int)’: main.cc:12:20: warning: declaration of ‘x’ shadows a member of ‘mint’ [-Wshadow] 12 | mint(long long x=0) : x((x%mod+mod)%mod) {}
xという名前の変数が被ってますよ,という警告. 私が拾ってきたmodintはこんな感じになっていたので,
class mint { long long x; public: mint(long long x=0) : x((x%mod+mod)%mod) {}
コンストラクタを一部修正.これで変数xがなくなる.
mint(long long a=0) : x((a%mod+mod)%mod) {}