/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型一维数组
* @param aLen int a数组长度
* @param k int整型
* @return int整型
*/
int FillArray(int* a, int aLen, int k ) {
// write code here
long f[aLen][k]; //一个数组来保存会用到的值 第二行为需要填充两个数。第2列表示有两个数可以填充
int mod=1000000007;
int i=1,j=0,m=0; //关于数组(i,j),i个数,j个值.第i个为max,(i-1,j)种。为max-1,有(i-1,j-1)种。为max-2,有(i-1,j-2)种。直至(i-1,1)手工写下这个数组,会发现如19行表示。
for(j=0;j<k;j++){f[0][j]=i;i++;} //第一行赋值为1,2,3,4,5,6.。。
for(i=1;i<aLen;i++){f[i][0]=1;} //第一列赋值为1,1,1,1,1,
for(i=1;i<aLen;i++){ //根据输入的参数,确定可能会用到的f[i][j];
for(j=1;j<k;j++){
f[i][j]=(f[i-1][j]+f[i][j-1])%mod; //mod防止溢出
}
}
printf("%ld %ld",f[1][4],f[aLen-1][k-1]);
int r=0,l=0,l1=0,l2=0,num=1,flag=0;
for(i=0;i<aLen;i++){ //外层循环判断数组里的树,主要为了找零
flag=0;
j=i;
while(a[j]==0&&j<aLen){ //为了找连续为零的个数
j++;
flag=1; //跳出while的时候,j是连续零后面的序号
}
if(flag==1){ //有零就找
if(i==0){ //l为了确定前面数组里的列(值的个数),
l1=1;
}else{
l1=a[i-1]; //值的下限,注意,下限最小为1
}
if(j==aLen){
l2=k;
}
else{
l2=a[j]; //值的上限,
}
l=l2-l1; //值
r=j-i-1; //填充个数
num=(num*f[r][l])%mod; //mod防止溢出
}
i=j;
}
return num;
}