# The 2019 China Collegiate Programming Contest Harbin Site I. Interesting Permutation

2019-11-05 13:02:32  阅读：124  来源： 互联网

# 链接:

https://codeforces.com/gym/102394/problem/I

# 题意：

DreamGrid has an interesting permutation of 1,2,…,n denoted by a1,a2,…,an. He generates three sequences f, g and h, all of length n, according to the permutation a in the way described below:

For each 1≤i≤n, fi=max{a1,a2,…,ai};
For each 1≤i≤n, gi=min{a1,a2,…,ai};
For each 1≤i≤n, hi=fi−gi.
BaoBao has just found the sequence h DreamGrid generates and decides to restore the original permutation. Given the sequence h, please help BaoBao calculate the number of different permutations that can generate the sequence h. As the answer may be quite large, print the answer modulo 109+7.

# 代码：

``````#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int MAXN = 1e5+10;
const int MOD = 1e9+7;

LL dp[MAXN];
int a[MAXN];
int n;

int main()
{
int t;
scanf("%d", &t);
while(t--)
{
memset(dp, 0, sizeof(dp));
scanf("%d", &n);
a = 0;
bool flag = true;
for (int i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
if (a[i] < a[i-1] || a[i] >= n || (i != 1 && a[i] == 0))
flag = false;
}
if (a != 0)
flag = false;
if (!flag)
{
puts("0");
continue;
}
dp = 1;
for (int i = 2;i <= n;i++)
{
if (a[i] > a[i-1])
dp[i] = (dp[i-1]*2)%MOD;
else
{
LL sp = a[i]-i+2;
dp[i] = (dp[i-1]*sp)%MOD;
}
}
printf("%d\n", (int)(dp[n]%MOD));
}

return 0;
}``````