CodeForces Gym 101669 B
阿新 • • 發佈:2018-12-15
題解:
手動模擬可以知道其實與事件發生的先後順序沒有關係(所以從左到右列舉就好了),f[i]表示前面位置的方塊已經全部落下,並且i位置以前造成了i-s[i]個空位的方案數。而num[i]表示之前決策中包含i個空位置的決策總數。
#include"bits/stdc++.h" using namespace std; const int MX = 1e6+7; const int mod = 1e9+7; int n,m; int cnt[MX]; int f[MX],num[MX]; void upd(int &x, int y) { x += y; if(x > mod) x-= mod; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL scanf("%d%d",&n,&m); ++n; for(int i = 1,x; i<= m; i++){ scanf("%d",&x); ++cnt[x]; } for(int i = 1; i <= n; i++) cnt[i] += cnt[i-1]; num[0] = 1; for(int i = 1; i <= n; i++) if(cnt[i] == cnt[i-1]){ if(i-1-cnt[i-1] >= 0) f[i] = num[i-1-cnt[i-1]]; if(i-cnt[i] >= 0) upd(num[i-cnt[i]],f[i]); } cout<<f[n]<<endl; return 0; }