期待値の線形性, 逆元 (AGC 028 B問題)
SoundHound Inc. Programming Contest 2018のC問題と雰囲気似てますね
こういう数学っぽい問題マジで無理すぎて毎回解説見て(o・ω・o)ホェーwwwってなってます
問題
以下ネタバレ注意
逆元の実装はけんちょんさんの記事「よくやる二項係数 (nCk mod. p)、逆元 (a^-1 mod. p) の求め方」を参考にしました。
こういう数学っぽい問題マジで無理すぎて毎回解説見て(o・ω・o)ホェーwwwってなってます
問題
以下ネタバレ注意
逆元の実装はけんちょんさんの記事「よくやる二項係数 (nCk mod. p)、逆元 (a^-1 mod. p) の求め方」を参考にしました。
- const int MOD = 1000000007;
- const int MAX = 100010;
- ll inv[MAX];//逆元
- void makeInv() {
- inv[1] = 1;
- FOR(i, 2, MAX) {
- inv[i]= MOD - inv[MOD%i] * (MOD / i) % MOD;
- }
- }
- //階乗のmod
- ll FactMod(int n, int m) {
- ll x = 1;
- FOR(i, 1, n + 1) {
- x *= i;
- x %= m;
- }
- return x;
- }
- ll cum[MAX];//累積和
- ll Ex[MAX];//ブロックiのコストがかかる回数の期待値
- ll A[MAX];
- int main() {
- int N; cin >> N;
- FOR(i,1, N+1) {
- cin >> A[i];
- }
- makeInv();
- ll fact = FactMod(N, MOD);
- cum[0] = 0;
- cum[1] = 1;
- FOR(i, 2, MAX) {
- cum[i] = (cum[i - 1] + inv[i]) % MOD;
- }
- FOR(i,1, N + 1) {
- Ex[i] = cum[i] - cum[0] + cum[N - i + 1] - cum[1];
- Ex[i] %= MOD;
- }
- ll ans = 0;
- FOR(i, 1, N + 1) {
- ans += Ex[i] * A[i];
- ans %= MOD;
- }
- ans *= fact;
- ans %= MOD;
- cout << ans << endl;
- }