链接:
#include <stdio.h>
int main()
{
puts("转载请注明出处[vmurder]谢谢,哎呀这篇我写得真的很费劲的~");
puts("网址:blog.youkuaiyun.com/vmurder/article/details/44604275");
}
。
不会啊。Euler Zigzag Number好神啊~
但是我可以给你丽洁爷的链接
http://hi.baidu.com/wjbzbmr/item/da020be63f6f41f92b09a410
fi,j=fi,j−1+fi−1,i−j
丽洁原话:【是1到n的排列中第一个是k且一开始下降的数量】 (不,写到这里我觉悟了,他说的是错的啊……)
就是说
fi,j
表示有一个序列,里面的数是
{1...n}
(当然,如果并不是这种形式,那么你可以在脑海中离散化一下,然后就变成1~n啦!),然后第一个数是
j
,并且第一个是山峰,然后这样
真是难为我这个蒟蒻了。
当然,这个原话……
fi,j
表示有个大小为
i
的数集{
然后转移方程
f_{i-1,i-j}则是开头选了
j
,剩下
……
另外注意,这题卡内存,64MB,需要滚动数组。
代码:
代码一分钟,题解俩小时。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5010
using namespace std;
int n,p;
int f[2][N];
int now,last;
int main()
{
int i,j;
scanf("%d%d",&n,&p);
f[1][1]=1;
now=1,last=0;
for(i=2;i<=n;i++)
{
now^=1,last^=1;
for(j=1;j<=n;j++)
f[now][j]=(f[now][j-1]+f[last][i-j])%p;
}
if(n==1)puts("1");
else printf("%d\n",(f[now][n]<<1)%p);
return 0;
}