现在很痛苦,等过阵子回头看看,会发现其实那都不算事。

【题目描述】
定义一个排列 a 的价值为满足|a[i]-i|<=1 的 i 的数量。
给出三个正整数 n,m,p,求出长度为 n 且价值恰好为 m 的排列的个数对 p 取
模的结果。
【输入描述】
第一行两个正整数 T,p,T 为数据组数,p 为模数。
接下来 T 行,每行两个正整数 n,m。
【输出描述】
T 行,每行一个非负数,表示答案。
【输入样例】
5 1887415157
3 1
3 2
3 3
50 10
1500 200
【输出样例】
1
2
3
621655247
825984474
【数据范围】
10%的数据:n<=10
30%的数据:n<=15
50%的数据:n<=200
另有 10%的数据:m=1
另有 10%的数据:m=n-1
100%的数据:1<=T,n,m<=2000,2<=p<=10^12


题意:
定义一个排列 a 的价值为满足|a[i]-i|<=1 的 i 的数量。
给出三个正整数 n,m,p,求出长度为 n 且价值恰好为 m 的排列的个数对 p 取模的结果。
T组询问,p事先给出。

题解:
因为n,m <= 2000,而且p是事先给出的,所以我们可以一次性预处理出n,m <= 2000的答案。

考虑一个长度为i的排列如何变成长度为i+1的排列。
一种情况是我在它末尾加入了一个数i+1,另一种情况是我用i+1替换掉了原来排列中的一个数,然后把被换掉的数放到排列的末尾。
那么,这个排列权值的变化就是:
第一种情况:在它末尾加入了一个数i+1,权值+1。
第二种情况:用i+1替换掉一个数,权值 += 加的贡献 - 换掉的数的贡献。

在DP当中,我们只需要考虑替换掉的数是否是i,以及i是否在位置i/i-1即可。总共有5种本质不同的状态,分类讨论转移即可。
复杂度O(nm)。


#include<bits/stdc++.h>
using namespace std; typedef long long LL; const int N=; int q,n,m,u,v;
LL p,ans,f[N][N][],x; int rd(){
int re=,f=;char c=getchar();
while ((c<'')||(c>'')) {if (c=='-') f=-f;c=getchar();}
while ((c>='')&&(c<='')) {re=re*+c-'';c=getchar();}
return re*f;
} int main(){
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
cin>>q>>p;
memset(f,,sizeof(f));
f[][][]=1ll;
f[][][]=1ll;f[][][]=1ll; n=;
for (int i=;i<n;++i)
for (int j=;j<=n;++j){
for (int k=;k<=;++k){
x=f[i+][j+][]+f[i][j][k];
x=(x<p)?x:(x-p);
f[i+][j+][]=x;
u=j+((k%)==);
v=+(k!=);
x=f[i+][u][v]+f[i][j][k];
x=(x<p)?x:(x-p);
f[i+][u][v]=x;
} if (f[i][j][]>0ll){
f[i+][j-][]=(f[i+][j-][]+f[i][j][]*(LL)(j-))%p;
f[i+][j][]=(f[i+][j][]+f[i][j][]*(LL)(i-j))%p;
}
if (f[i][j][]>0ll){
x=f[i+][j][]+f[i][j][];
x=(x<p)?x:(x-p);
f[i+][j][]=x;
f[i+][j-][]=(f[i+][j-][]+f[i][j][]*(LL)(j-))%p;
f[i+][j][]=(f[i+][j][]+f[i][j][]*(LL)(i-j))%p;
}
if (f[i][j][]>0ll){
x=f[i+][j][]+f[i][j][];
x=(x<p)?x:(x-p);
f[i+][j][]=x;
f[i+][j-][]=(f[i+][j-][]+f[i][j][]*(LL)(j-))%p;
f[i+][j][]=(f[i+][j][]+f[i][j][]*(LL)(i-j-))%p;
}
if (f[i][j][]>0ll){
x=f[i+][j+][]+f[i][j][];
x=(x<p)?x:(x-p);
f[i+][j+][]=x;
f[i+][j-][]=(f[i+][j-][]+f[i][j][]*(LL)(j-))%p;
f[i+][j][]=(f[i+][j][]+f[i][j][]*(LL)(i-j-))%p;
}
if (f[i][j][]>0ll){
x=f[i+][j+][]+f[i][j][];
x=(x<p)?x:(x-p);
f[i+][j+][]=x;
if (j>) f[i+][j-][]=(f[i+][j-][]+f[i][j][]*(LL)(j))%p;
f[i+][j][]=(f[i+][j][]+f[i][j][]*(LL)(i-j-))%p;
}
} for (;q>;--q){
cin>>n>>m;
ans=(f[n][m][]+f[n][m][]+f[n][m][]+f[n][m][]+f[n][m][])%p;
cout<<ans<<'\n';
}
return ;
}

C 题解———2019.10.16的更多相关文章

  1. A 题解————2019.10.16

    [题目描述] 对于给定的一个正整数n, 判断n是否能分成若干个正整数之和 (可以重复) ,其中每个正整数都能表示成两个质数乘积. [输入描述]第一行一个正整数 q,表示询问组数.接下来 q 行,每行一 ...

  2. B 题解————2019.10.16

    相信他说的话,但不要当真 [题目描述]有一个长度为 n 的自然数序列 a,要求将这个序列恰好分成至少 m 个连续子段. 每个子段的价值为该子段的所有数的按位异或.要使所有子段的价值按位与的结果最大,输 ...

  3. 2019.10.16&17小结

    话说也蛮久没写小结了,主要这两次考试失分严重,还是总结下吧. 10.16 T1 小奇挖矿2 100/0 [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市 ...

  4. @CSP模拟2019.10.16 - T3@ 垃圾分类

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个 ...

  5. js第二次作业——2019.10.16

    第一题:完成省城市的三级联动(包括湖南省),附代码和效果图. 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 </head> ...

  6. Fiborial 题解——2019.10.14

    一看到这个题 就感觉...cao,, 什么东西...??! 然后就开始暴力求Fn 然鹅我并不会写高精(我太菜了) 只能求到大概10左右 在吧Fn给质因数分解 求出其因子个数 妄图找到什么有关的规律 但 ...

  7. 忍者钩爪 ( ninja) 题解———2019.10.19

    可以到这里测..嘿嘿嘿 题目: [问题 描述 ] 小 Q 是一名酷爱钩爪的忍者, 最喜欢飞檐走壁的感觉, 有一天小 Q 发现一个练习使用钩 爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一 ...

  8. T1 :最小值(min)题解 ——2019.10.15

    思路: 对于 % 30 的数据,可以想到一个 Dp 方程: 其中dp[i]表示分割[1,i]的最大答案 代码: #include<cstdio> #include<cstring&g ...

  9. 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画)

    [源码下载] 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画) 作者:webabcd 介绍背水一战 Windows 10 之 动画 PopInThemeA ...

随机推荐

  1. javascript碰撞检测的方法

    javascript碰撞检测的方法需要把要检测碰撞的精灵都放到数组里array push 然后循环遍历数组里的精灵检测碰撞 ps:不放到数组里没办法循环遍历检测每个精灵核心代码如下 <pre&g ...

  2. pandas的使用(6)离散化和合并

    pandas的使用(6)离散化和合并

  3. Jmeter参数化之数据库读取数据

    以读取mysql数据库为例 1.下载一个mysql驱动包,最好去mysql官网下载 下载网址:https://dev.mysql.com/downloads/connector/j/ Select O ...

  4. 【CTS2019】氪金手游(动态规划)

    [CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...

  5. ActiveMq C# 消息特性:延迟和定时消息投递

    ActiveMQ from version 5.4 has an optional persistent scheduler built into the ActiveMQ message broke ...

  6. 记录一次OracleJDK开发的项目发部到Linux中使用OpenJDK启动后失败的错误的解决方案

    一.现象 基于JAVA SpringBoot2.0.4的项目,发部后项目发部后,放到OpenJDK环境中运行时,提示下列错误: 2019-10-22 10:03:55 [main] WARN  o.s ...

  7. HighChat 动态绑定数据记录

    最近刚开始做图形操作,纠结了一上午,highchat 动态绑定数据这块一直不知道怎么绑定,后来多次尝试,发现 1.x轴的数据是个数组格式,我从后台传到前台的时候,js中用数组进行处理数据,然后赋值到c ...

  8. vue自学笔记

      做前端也做了一段时间了,为了高薪,不能一直做网页不是~~,所以从今天开始整理vue的笔记 内容都是从网上搜集整合并且自己实践过了的,需要注意的点,也在后面标注了“注”   当然了,如果有什么问题的 ...

  9. vue 的 Class 与 Style 绑定

    操作元素的 class 列表和内联样式是数据绑定的一个常见需求.因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼接麻烦且易错.因此,在将 ...

  10. FPM十一:点击POPUP显示明细

    沿接着前面的Search和List.在LIST中点击一列,弹出窗口显示明细. 1.list中定义事件: METHOD if_fpm_guibb_list~get_definition. DATA:gt ...