正解:数论 解题报告: 传送门 这题,想不到就很痛苦,但是理解了之后还是觉得也没有很难,,,毕竟实现不难QAQ 首先关于前面k对情侣的很简单,就是C(n,k)*C(n,k)*A(k,k)*2k 随便解释下,就是选座位*选情侣*情侣选座位*情侣之间换左右位置 然后难点大概在于后面的(n-k)对不能在一起的怎么求方案数 就考虑,dp,设f[i]:i对情侣的情况 然后随便选一排,显然选人有(2*i)*(2*i-2) 那对他们的情侣,有两种可能 一种是他们的情侣就坐一块儿了,于是就是(i-1)*2*f[…
题面 传送门 题解 首先我们算出刚好有\(k\)对情侣的方案数 从\(n\)对情侣中选出\(k\)对,方案数为\({n\choose k}\) 从\(n\)排座位中选出\(k\)排,方案数为\({n\choose k}\) 情侣之间可以交换座位,方案数为\(2^k\) 座位之间可以随便排列,方案数为\(k!\) 然后我们还需要强制剩下的\(n-k\)对情侣不匹配 设\(g_i\)表示\(i\)对情侣没有一对匹配的方案数 第一排坐两个不是情侣的人的方案数有\(2n(2n-2)\),设这两个人为\(…
洛谷题面传送门 A 了这道题+发这篇题解,就当过了这个七夕节吧 奇怪的过节方式又增加了 首先看到此题第一眼我们可以想到二项式反演,不过这个 \(T\) 组数据加上 \(5\times 10^6\) 的数据范围肯定是反演不动的,因此考虑怎样不反演. 我们很显然可以将求解这个问题划分成两部分:选出 \(k\)​ 对相邻的情侣并将它们的位置安排好+排列好剩下 \(n-k\)​ 对情侣.两部分显然是独立的,因此分别考虑.第一部分是是比较容易的,选出 \(k\)​ 对情侣方案数 \(\dbinom{n}{…
专心OI - 找祖先 题目背景 \(Imakf\)是一个小蒟蒻,他最近刚学了\(LCA\),他在手机\(APP\)里看到一个游戏也叫做\(LCA\)就下载了下来. 题目描述 这个游戏会给出你一棵树,这棵树有\(N\)个节点,根结点是\(R\),系统会选中\(M\)个点\(P_1,P_2...P_M\),要\(Imakf\)回答有多少组点对\((u_i,v_i)\)的最近公共祖先是\(P_i\).\(Imakf\)是个小蒟蒻,他就算学了\(LCA\)也做不出,于是只好求助您了. \(Imakf\)…
这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E6%B3%95/ 分治法 先空着 看一下这个第三个方法(随机增量哈希,O(n)) 1.千万不要用unordered_map/hash_map!T飞是肯定的:要手写哈希表,所以码量就很大:手写哈希表方法记一下 2.事实上以d为边长画格子,每次遍历相邻的9个格子,常数要比以d/2边…
挺有意思的一道题... code: #include <bits/stdc++.h> using namespace std; #define N 5000006 #define mod 998244353 #define ll long long #define setIO(s) freopen(s".in","r",stdin) int fac[N],inv[N],f[N],qpow[N],jv[N]; void Initialize() { int…
题目 传送门:QWQ 分析 不想画图. https://www.luogu.org/problemnew/solution/P1641 好神仙的题啊. 代码 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ll fac[maxn]; int exgcd(ll& x,ll& y,ll a,ll b){ ;y=;} else{ exgc…
题面 传送门 题解 这里最麻烦的问题就是它不保证\(A_0=1\) 如果\(A_0>1\),那么直接整个多项式乘上个\(A_0\)的逆元,最后输出答案的时候再把答案乘上\({A_0}^m\) 如果\(A_0=0\),我们需要向右找到第一个不为\(0\)的位置,然后把整个多项式除以\(x^i\),最后再乘上\(x^{im}\)就行了 //minamoto #include<bits/stdc++.h> #define R register #define fp(i,a,b) for(R i…
会$TLE$... C++ Code:(HLPP) #pragma GCC optimize(3) #pragma GCC optimize("unroll-loops") #include <cstdio> #include <cstring> #include <vector> #include <queue> #define maxn 1210 #define maxm 120010 const int inf = 0x3f3f3f…
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度. 输出格式: 输出文件仅一行,表示要求…