码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj1925][Sdoi2010]地精部落

时间:2017-10-26 13:29:58      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:its   image   div   long   n+1   ima   bsp   span   html   

大佬们好神啊,考试都切掉了这题,,本来以为T3可做写完发现不对结果T2还崩了。qwq好闹心啊。。。

找到了一个不玄乎的题解至少转移我看懂了。。clj的都太神了我等蒟蒻不能理解qwq

转自 http://www.xuebuyuan.com/1776773.html

题意:求$1$到$n$个所有排列中有多少种满足高低交错。

思路:$f[n][k]$表示n个数,最后一个为$k$且最后两个递增,$g[n][k]$表示$n$个数最后一个数为$k$且最后两个递减。对于$f[n][k]$,若我们将每个数$x$换为$n+1-x$,则就成了$g[n][n+1-k]$,因此有:$f[n][k]=g[n][n+1-k]$。那么可得:

技术分享

 由于对称性,我们计算出:

技术分享

那么最后的答案就是$ans*2$。


 

 

技术分享
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=10005;
ll f[2][N],ans;
int n,p;
int main(){
    cin>>n>>p;
    if(n==1) ans=1;
    if(n==2) ans=2;
    f[0][1]=0;f[0][2]=1;
    for(int i=3;i<=n;i++){
        int k=i&1;
        for(int j=1;j<=i;j++){
            f[k][j]=f[k^1][i-j+1]+f[k][j-1];
            f[k][j]%=p;
        }
    } 
    for(int i=1;i<=n;i++)
    ans=(ans+f[n&1][i])%p;
    cout<<(ans*2)%p;
}
View Code(代码我的)

[bzoj1925][Sdoi2010]地精部落

标签:its   image   div   long   n+1   ima   bsp   span   html   

原文地址:http://www.cnblogs.com/orzzz/p/7736040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!