B君的第九题

对于一个排列\(a_1, a_2,\dots,a_n\),如果对于一个i满足\(a_{i-1}<a_i>a_i+1\)则称i是一个极大值。我们认为\(a_0=a_{n+1}=0\)。考虑\(1,2,\dots,n\)的所有排列,问有多少个排列恰好有m个极大值。输出答案对p取模的结果。\(1\le n\le10^9, 1\le m\le10, 2\le p\le1001\)

对于统计排列数,其实没有必要按照给出的a的顺序来dp,可以先把a从小到大排序,然后用\(f[i][j]\)表示dp到第i个数,有j个山峰的方案数。由于当前数大于之前序列的所有数,考虑把它插入序列。如果它插在山峰旁边,那么山峰个数仍然不变,否则山峰个数会加一个。因此\(f[i][j]=f[i-1][j]*2j+f[i-1][j-1]*(i-2*(j-1))\)。

但是这个式子和i有关,没法用矩阵乘法优化dp。怎么办呢?由于所有运算都是在模p意义下的,所以说直接对于i=1到p先把矩阵暴力求出来,然后用矩阵快速幂即可!

#include <cstdio>
#include <cstring>
using namespace std; const int maxn=1e3+5, maxm=12;
int n, m, p;
inline void up(int &x, int y){ x+=y-p; x+=(x<0?p:0); } struct Matrix{
int a[maxm][maxm];
}g[maxn], re, c, ans;
Matrix& operator *(const Matrix &a, const Matrix &b){
memset(re.a, 0, sizeof(re.a));
for (int i=0; i<=m; ++i)
for (int j=0; j<=m; ++j)
for (int k=0; k<=m; ++k)
up(re.a[i][j], a.a[i][k]*b.a[k][j]%p);
return re;
} int main(){
scanf("%d%d%d", &n, &m, &p);
for (int i=0; i<=m; ++i) c.a[i][i]=1, ans.a[i][i]=1;
for (int i=1; i<=p; ++i){
for (int j=0; j<m; ++j){
//if (i-2*j<0) break; //?
g[i].a[j][j]=2*j%p,
g[i].a[j][j+1]=((i-2*j)%p+p)%p;
}
g[i].a[m][m]=2*m%p;
c=c*g[i];
}
int mi=n/p;
for (; mi; c=c*c, mi>>=1) if (mi&1) ans=ans*c;
for (int i=1; i<=n%p; ++i) ans=ans*g[i];
printf("%d\n", ans.a[0][m]);
return 0;
}

B君的第九题的更多相关文章

  1. test20181020 B君的第二题

    题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...

  2. B 君的第二题 (hongkong)

    B 君的第二题 (hongkong) 题目大意: 一个长度为\(n(n\le2\times10^5)\)的数组,给定一个数\(k(k\le40)\).用\(a[i][j]\)表示该数组\(i\)次前缀 ...

  3. CTF---Web入门第九题 FALSE

    FALSE分值:10 来源: iFurySt 难度:易 参与人数:4567人 Get Flag:2144人 答题人数:2157人 解题通过率:99% PHP代码审计 hint:sha1函数你有认真了解 ...

  4. test20181017 B君的第一题

    题意 分析 考场做法 对p的幂打表发现,我们一定可以把x和y的二进制位从低到高依次调整成0. 具体而言,从0次幂开始每两个分为一组a,b,那么0,a,b,a+b组合中的一种可以将x,y的对应二进制位都 ...

  5. leetcode第九题--Palindrome Number

    Problem: Determine whether an integer is a palindrome. Do this without extra space. click to show sp ...

  6. test20181016 B君的第二题

    题意 分析 考场暴力50分. 考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了. 时间复杂度\(O(n \log n + m \log n)\) #inclu ...

  7. test20181017 B君的第二题

    题意 分析 考场50分 旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组. 但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \ ...

  8. test20181018 B君的第一题

    题意 分析 考场爆零做法 考虑dp,用\(f(i,j,0/1)\)表示i及其子树中形成j个边连通块的方案数,其中i是否向外连边. \(O(n^3)\),转移方程太复杂就打挂了. #include< ...

  9. leetcode 第九题 Palindrome Number(java)

    Palindrome Number time=434ms 负数不是回文数 public class Solution { public boolean isPalindrome(int x) { in ...

随机推荐

  1. java中如何将OutputStream转换为InputStream

    在不需要文件生成的情况下,直接将输出流转换成输入流.可使用下面的三种方法: 如果你曾经使用java IO编程,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要 ...

  2. UE4异步载入资源

    转自:http://blog.ch-wind.com/ue4%E5%BC%82%E6%AD%A5%E8%BD%BD%E5%85%A5%E8%B5%84%E6%BA%90/ 所有的“硬”指针指向的资源都 ...

  3. mybatis 学习三 关键文件解析

    1:  mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  4. CreateThread demo

    #include "stdafx.h"#include<windows.h>#include<strsafe.h>//win2003SDK必须安装 要不无此 ...

  5. C#windows窗体应用程序如何自适应大小

    用C#的windows窗体应用程序做界面十分轻松,但是系统默认是没有让控件跟随窗体的大小改变而已改变的.所以需要我们手动去设置让窗体控件随着窗体的大小改变而改变.所以我们只需要将控件选择 然后把Anc ...

  6. Python之list的创建以及使用

    list是一种有序的集合,可以随意添加和删除里面的元素. 空的list的定义:L = [] list当中的元素用[]概括起来. 在list当中可以使用索引来进行访问: 在这里我们要注意我们在进行索引的 ...

  7. 使用HttpWebRequest POST 文件,带参数

    public string HttpUploadFile(string url, string file, string paramName, string contentType, NameValu ...

  8. jQuery-图片的放大镜显示效果(不需要大小图) ,放大镜图层显示在图片左右侧,不适用table

    放大镜图层显示在图片的一侧,但当图片嵌套到table里,放大镜图层位置就有误,此方法只适用于没有table 错误原因: 原来的写法是图片相对于Td 的位置,而不是图片的真实位置,所以两张图片的坐标是一 ...

  9. 奇葩问题 eclipse下 maven项目 java Resource报个小红叉,然而里面却没有小红叉

    之前没注意,不知是一开始就有还是这两天才有,说下解决方案: 右击项目“Properties”,在弹出的“Properties”的左侧边框,单击“Project Facets”,打开“Project F ...

  10. css 层叠式样式表(1)

    实用css有三种格式:内嵌:内联:外部: 分类:内联:写在标记的属性位置,优先级最高,重用性最差内嵌:写在页面的head中,优先级第二,重用性一般外部:写在一个以css结尾的文件中,通过引用来建立文件 ...