P4798 [CEOI2015 Day1]卡尔文球锦标赛
题传
谁来帮窝卡一卡常 qwq,不开 O2 过不去。。。
不难想到,每个人选择的队伍编号只能是
但关键是,对于当前状态,我们不知道它与目标状态的差别,引入新一维:
前驱不好找,我们考虑找它对后面的贡献。
对于下一位是
如果下一位是
Code:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define now (i&1)
#define nxt ((i+1)&1)
#define int long long
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const signed mo=1e6+7;
inline int read(){
char ch=getchar();int x=0, f=1;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
inline int ksm(int a, int b){
int ret=1;
for(; b; b>>=1, a=1ll*a*a%mo)
if(b&1) ret=1ll*ret*a%mo;
return ret;
}
inline int mod(int x){return (x%mo+mo)%mo;}
namespace Solution{
const int N=1e4+5;
const int M=1e3+5;
int n, a[N], ans, f[2][N][2];
signed work(){
n=read();for(int i=1; i<=n; i++) a[i]=read();f[1][1][1]=1;
for(int i=1; i<n; i++)
for(int j=1; j<=i; j++)
f[nxt][j][0]=mod(f[nxt][j][0]+1ll*f[now][j][0]*j%mo+1ll*f[now][j][1]*(a[i+1]-1)%mo),
f[nxt][j][1]=mod(f[nxt][j][1]+(a[i+1]==j+1?0:f[now][j][1])),
f[nxt][j+1][0]=mod(f[nxt][j+1][0]+f[now][j][0]), f[nxt][j+1][1]=mod(f[nxt][j+1][1]+(a[i+1]==j+1?f[now][j][1]:0)),
f[now][j][0]=f[now][j][1]=0;
for(int i=1; i<=n; i++)
ans=mod(ans+f[n&1][i][0]+f[n&1][i][1]);
printf("%lld", ans);
return 0;
}
}
signed main(){
Solution :: work();
return 0;
}