题意:给定一个排列,设定一个变换为pi^-1=k当且仅当pk=i,要求所有i满足abs(pi-pi^-1)<=1的所有p的排列数

思路:假设x=p[k],那么在p[x-1],p[x],p[x+1]当中必定有一个为k,才能使条件满足,但是思路到这就停顿了,于是我们转换思想,不考虑k会放在哪里而是考虑构造一下合法的子状态,例如p[i]=i就是合法的解,p[i]=i+1,p[i+1]=i,也是合法状态,p[i]=j,p[i+1]=j+1,p[j+1]=i,p[j]=i+1,也是可行的,不断推导,可以发现,上述三种情况涵盖了所有子集解的合法情况,于是我们对这三种情况做组合数学的分析

可见第三种情况下实际上只需从n-2*s种选出2*s个相邻的数即可也就是C(2*s)(n-2*s),但是上一步运算只是选定了参与构建第三种情况的数,仍需要对这些数进行有序的两两分组(为何要有序呢,因为每一个值需要对应j+1或是j,我们假定前面的数对应j,后面的数对饮j+1,这样就是所有情况了),即(s*2)!/s!,那么对于枚举的第三种情况的所有情况就都计算到了,C(2*s)(n-2*s)*(s*2)!/s!

对于第1,2种情况,我们可以简单的dp一下,每次新加入一个数,我们既可以使其自成一个环,也可以让它与任意一个数对应为第二种情况

dpi表示用i个数组成前两种情况的合法排列方法,dpi=dpi-1+dpi-2*(i-1)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string>
#include<bitset>
#include<cmath>
#include<array>
#include<atomic>
#include<sstream>
#include<stack>
#include<iomanip>
//#include<bits/stdc++.h>//#define int ll
#define pb push_back
#define endl '\n'
#define x first
#define y second
#define Endl endl
#define pre(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,b,a) for(int i=b;i>=a;i--)
#define si(x) scanf("%d", &x);
#define sl(x) scanf("%lld", &x);
#define ss(x) scanf("%s", x);
#define YES {puts("YES");return;}
#define NO {puts("NO"); return;}
#define all(x) x.begin(),x.end()using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
typedef pair<char, int> PCI;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<ll, ll> PLL;
const int N = 1000010, M = 2 * N, B = N, MOD = 998244353;
const double eps = 1e-8;
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
int n, m, k;
ll fact[N], infact[N];
ll dp[N];ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lowbit(ll x) { return x & -x; }
ll qmi(ll a, ll b, ll mod) {ll res = 1;while (b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}inline void init() {fact[0] = infact[0] = 1;pre(i, 1, N-1){fact[i] = (fact[i - 1] * i) % MOD;infact[i] = (infact[i - 1] * qmi(i, MOD - 2, MOD)) % MOD;}dp[1] = dp[0] = 1;pre(i, 2, N - 1)dp[i] = (1ll * dp[i - 1] + dp[i - 2] * (i - 1) % MOD) % MOD;
}ll C(ll a, ll b)
{return (fact[a] * infact[a - b]%MOD * infact[b]) % MOD;
}void slove()
{cin >> n;ll ans = 0;for (int k = 0; k <= n / 4; k++){ll cur = dp[n - 4 * k];cur = cur * C(n - 2 * k, 2 * k) % MOD;cur = cur * fact[2 * k] % MOD;cur = cur * infact[k] % MOD;ans = (ans + cur) % MOD;}cout << ans << endl;return;
}signed main()
{int _;si(_);//_ = 1;init();while (_--){slove();}return 0;
}

Codeforces div1+2相关推荐

  1. codeforces泛做

    codeforces div1的题目,一般是做B.C.D 有的A题觉得有价值也会做,死活不会的就跳了-- 364 B: Connecting Universities Problem: 一颗无根树上给 ...

  2. 国内C/C++刷题网站汇总

    作者:Luau Lawrence 链接:https://www.zhihu.com/question/25574458/answer/31175374 来源:知乎 - Welcome To PKU J ...

  3. 刷题!刷题!刷题网!!!

    0.网易有道OJ : http://oj.youdao.com/ 刷题汇总: https://vjudge.net/ 1.赛码网 :http://www.acmcoder.com/index 2.计蒜 ...

  4. 整理:ACM相关好的网站 OJ Blog (不断更新)

    ACM-ICPC世界网站 http://acm.timus.ru http://acm.sgu.ru http://acm.hnu.cn http://acm.hdu.edu.cn http://ac ...

  5. 半小时写完替罪羊重构点分树做动态动态点分治之紫荆花之恋的wyy贴心指导

    刷题训练 初学者 有一定语言基础,但是不了解算法竞赛,水平在联赛一等奖以下的. 参考书:<算法竞赛入门经典--刘汝佳>,<算法竞赛入门经典训练指南--刘汝佳> 题库:洛谷(历年 ...

  6. 【Codeforces #167 Div1 Div2】Solutions

    [A. Dima and Friends] http://www.codeforces.com/contest/272/problem/A 题目大意:n+1个人出手指头,加起来再做类似约瑟夫的出圈,问 ...

  7. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  8. codeforces #310 div1 C

    操作无论是U还是L,都会使原图形分裂成两个图形,且两个图形的操作互不影响 我们又发现由于操作点只可能在下斜线上,如果将操作按x排序 那么无论是U还是L,都会将操作序列完整分割成两半,且两个操作序列互不 ...

  9. CodeForces:103(div1)104(div2)

    文章目录 前言 CF104A Blackjack Description\text{Description}Description Solution\text{Solution}Solution Co ...

最新文章

  1. 源码分析-Activity的启动流程
  2. (Lesson2)根据类名称和属性获得元素-JavaScript面向对象
  3. 17、任务十六——事件委托机制、简单表单验证
  4. qt如何用python结合_在Qt(C++)中与Python混合编程
  5. java入门,学习笔记
  6. .NET中的CTS、CLS和CLR
  7. 从0成为Facebook广告高手系列教程
  8. Android中如何实现多个框,在android中的对话框中设置多个文本框
  9. MWeb 博客生成软件如何使用“发布脚本”发布网站?
  10. 数据、数据库、数据库管理系统、数据库系统的概念。
  11. excel表格操作之数据分级统计
  12. 基于 Win32 的应用程序
  13. Android Studio个人使用记录
  14. C语言那些事之脉冲丢包率检测
  15. 微软Visio流程图软件,Visio流程图制作工具下载安装教程(1)
  16. 第1章第6节:如何打开之前编辑过的演示文稿 [PowerPoint精美幻灯片实战教程]
  17. html ico 图片 无效,设置favicon.ico manifest.json无效
  18. PostgreSQL学习篇9.3 浮点数类型
  19. Shell之awk命令
  20. [精华]史上最强买笔记本电脑专业精粹导购指南,让奸商彻底晕菜!

热门文章

  1. win10麦克风说话没声音_怎样选主播麦克风
  2. java itext图片大小_java – iText:降低图像质量(减少生成的PDF大小)
  3. accept()函数说明
  4. stl排序之sort函数
  5. F4—LVDS接口LCD显示彩图测试-2023-02-25
  6. 关于python程序格式框架以下选项中描述错误的是_关于Python程序格式框架的描述,以下选项中错误的是...
  7. C#编程_实现简易的任务管理器
  8. 【VScode】VCode配置C++编译器
  9. 典型相关分析 python_CCA典型关联分析原理与Python案例
  10. Java 多线程的应用场景