Codeforces div1+2
题意:给定一个排列,设定一个变换为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相关推荐
- codeforces泛做
codeforces div1的题目,一般是做B.C.D 有的A题觉得有价值也会做,死活不会的就跳了-- 364 B: Connecting Universities Problem: 一颗无根树上给 ...
- 国内C/C++刷题网站汇总
作者:Luau Lawrence 链接:https://www.zhihu.com/question/25574458/answer/31175374 来源:知乎 - Welcome To PKU J ...
- 刷题!刷题!刷题网!!!
0.网易有道OJ : http://oj.youdao.com/ 刷题汇总: https://vjudge.net/ 1.赛码网 :http://www.acmcoder.com/index 2.计蒜 ...
- 整理:ACM相关好的网站 OJ Blog (不断更新)
ACM-ICPC世界网站 http://acm.timus.ru http://acm.sgu.ru http://acm.hnu.cn http://acm.hdu.edu.cn http://ac ...
- 半小时写完替罪羊重构点分树做动态动态点分治之紫荆花之恋的wyy贴心指导
刷题训练 初学者 有一定语言基础,但是不了解算法竞赛,水平在联赛一等奖以下的. 参考书:<算法竞赛入门经典--刘汝佳>,<算法竞赛入门经典训练指南--刘汝佳> 题库:洛谷(历年 ...
- 【Codeforces #167 Div1 Div2】Solutions
[A. Dima and Friends] http://www.codeforces.com/contest/272/problem/A 题目大意:n+1个人出手指头,加起来再做类似约瑟夫的出圈,问 ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
- codeforces #310 div1 C
操作无论是U还是L,都会使原图形分裂成两个图形,且两个图形的操作互不影响 我们又发现由于操作点只可能在下斜线上,如果将操作按x排序 那么无论是U还是L,都会将操作序列完整分割成两半,且两个操作序列互不 ...
- CodeForces:103(div1)104(div2)
文章目录 前言 CF104A Blackjack Description\text{Description}Description Solution\text{Solution}Solution Co ...
最新文章
- 源码分析-Activity的启动流程
- (Lesson2)根据类名称和属性获得元素-JavaScript面向对象
- 17、任务十六——事件委托机制、简单表单验证
- qt如何用python结合_在Qt(C++)中与Python混合编程
- java入门,学习笔记
- .NET中的CTS、CLS和CLR
- 从0成为Facebook广告高手系列教程
- Android中如何实现多个框,在android中的对话框中设置多个文本框
- MWeb 博客生成软件如何使用“发布脚本”发布网站?
- 数据、数据库、数据库管理系统、数据库系统的概念。
- excel表格操作之数据分级统计
- 基于 Win32 的应用程序
- Android Studio个人使用记录
- C语言那些事之脉冲丢包率检测
- 微软Visio流程图软件,Visio流程图制作工具下载安装教程(1)
- 第1章第6节:如何打开之前编辑过的演示文稿 [PowerPoint精美幻灯片实战教程]
- html ico 图片 无效,设置favicon.ico manifest.json无效
- PostgreSQL学习篇9.3 浮点数类型
- Shell之awk命令
- [精华]史上最强买笔记本电脑专业精粹导购指南,让奸商彻底晕菜!
热门文章
- win10麦克风说话没声音_怎样选主播麦克风
- java itext图片大小_java – iText:降低图像质量(减少生成的PDF大小)
- accept()函数说明
- stl排序之sort函数
- F4—LVDS接口LCD显示彩图测试-2023-02-25
- 关于python程序格式框架以下选项中描述错误的是_关于Python程序格式框架的描述,以下选项中错误的是...
- C#编程_实现简易的任务管理器
- 【VScode】VCode配置C++编译器
- 典型相关分析 python_CCA典型关联分析原理与Python案例
- Java 多线程的应用场景