Link 众所周知Kirchhoff定理中的边权可以是多项式。 直接NTT的复杂度是\(O(n^4\log n)\)。 带\(n\)个值进去算然后快速插值Lagrange插值或者Gauss消元是\(O(n^4)\)的。 #include<bits/stdc++.h> #define LL long long using namespace std; namespace IO { char ibuf[(1<<21
题面 题解 第一问很简单, 如果 \(n - k\) 是偶数那么答案就是 \(2 ^ k - 1\) , 如果 \(n - k\) 是奇数答案就是 \(2^k - 2\) 第二问怎么办, 我们对于 \(n - k\) 是偶数讨论 我们要做的是, 对于每一个数, 我们要让他选奇数次最后的答案可能性才会最大 并且所有的数选的次数加起来是
题面 7-3 1C. 染色图 定义一张无向图 , 是 k 可染色的当且仅当存在函数 1 满足对于 G 中的任何一条边 (,都有 (。 定义函数 ( 的值为所有包含 n 个点的无自环、无重边的 k 可染色无向图中的边数最大值。举例来说,(。 现在给出三个整数 ,,你需要求解: m
题面 7-6 1F. 乘法 给出一个长度为 n 的数列 和一个长度为 m 的数列 ,可以构造得到一个 n×m 的矩阵 C,其中 Ci,j=Ai×Bj。 给出整数 K,你需要求出 C 中第 K 大的数的值。 输入格式: 第一行输入三个整数 ,。 第二行输入 n 个空格隔开的
排列组合 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[100007]; 5 const long long mod = 1e9+7; 6 long long inv[100007]; 7 long long qpow(int p,int q){ 8 long long s=1; 9 for(;q;q>>=1,p=1l
题意 有一种贪心求最大独立集的算法: 随机一个排列 按顺序加入独立集,如果一个点能加入,就加入\({S}\) 给出一张图,问得出正确答案的概率。 \(n \leq 20\) 传送门 思路 用 \(dp[i][s]\) 表示排列集合为 \(i\),最大独立集的大小为 \(s\) 的方案数,\(a[x]\)表示与\(x\)相连的点集。 考虑
Description 题库链接 一共有 \(n\) 个关卡,你初始在第一个关卡。通过第 \(i\) 个关卡的概率为 \(p_i\)。每一轮你可以挑战一个关卡。若通过第 \(i\) 个关卡,则进入第 \(i+1\) 个关卡,否则重新回到第 \(1\) 个关卡。通过第 \(n\) 个关卡则算成功。问期望多少轮游戏才能成功。 \(1\leq
题目传送门 DP 经典题 考虑从小到大把数加入排列内 如下图(\(A\) 已经经过排序): 我们考虑如上,在 \(i\) ( \(A_i\) )不断增大的过程中,维护上面直线 \(y=A_i\) 之下的部分的长度之和 于是我们定义 DP :\(f[i][j][k][h]\) 表示插入了前 \(i\) 个数,分成 \(j\) 段,\(y=A_i\) 之下的部分长
水题,逆推一遍即可~ code: #include <bits/stdc++.h> #define N 12000010 #define LL long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; const LL mod=1000000007; int inv[N]; int main() { // setIO("
T1 gcdlcm 用cnt[i]记录i出现了多少次,枚举约数d,检查cnt[j*d] (j*d<=maxn),用f,g记录最大值和次大值; 若cnt[j*d]>=2,则f,g都更新为j*d; 若cnt[j*d]==1则g=f,f=j*d; 若f>0,g>0,则答案更新为f*g/d; 注:若f与g相同,由于上面的d会枚举到,所以不会影响答案; code: #include<iostream>#inc
题意 \(n\)个数,每个\(k\)个,将\(n\times k\)个数随意排列,把每数中的第一个改写为\(0\),求不同序列个数。 $n,k \le 2000 $ 传送门 思路 又是一道神仙\(dp\) 设\(dp_{i,j}\)表示当前已经有了\(i\)个\(0\),有\(j\)个数已经填完的方案数。 转移分两种: 填入一个\(0\):\(dp[i+1][j]+=dp[
设\(f[i][j]\)表示当前有\(i\)个白球,一共放完了\(j\)种球 显然有\(j <= i\) 对于每个状态目前已经放下去的球是固定了的,那么考虑转移 放白球 从\(f[i - 1][j]\)转移 放没有出现过的球 \((n - j + 1) * f[i][j - 1] * C(k - 2, n * k - i - (j - 1) * (k - 1) - 1)\) 第二种的C是
先把所有的数异或起来 得到sum 然后sum有一些位是1一些位是0 是0的位表示所有数里面有这位的数是偶数个 则无论怎么划分数 这一位对最终的答案都是不会有贡献的 因为偶数=偶数+偶数/奇数+奇数 所以我们把所有数直接&sum不管那些没有贡献的位 再一个个插入作线性基 拿出一个最高
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int f[257],fac[257],ifac[257];const long long mod = 1e9+7;int qpow(int x,int y){ int tamp=1; while(y){ if(y&1) tamp=1ll*tamp*x%mod; x=1ll*x*x%m
A \(n^2\) 删点+暴力更新+bfs。 Code #include<bits/stdc++.h> using namespace std; typedef long long D; typedef pair<D,D> P; const int maxn=7003; int n,tot[maxn]; P a[maxn]; bool del[maxn]; bitset<maxn> b[maxn]; queue<int> q; int main(){
long long ANS=1LL*num*((1LL)*n*(n-1))/2; 其中用了1LL: LL其实代表long long,*1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量。 代码中的ANS的定义为: long long ANS ANS是long long类型的, ANS=1LL*num*((1LL)*n*(n-1))/2; 不至于后
题意 BZOJ4559 题解 看这,写得真好。 CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 105; const int mod = 1e9 + 7; int n, M, K, U[MAXN], R[MAXN], c[MAXN][MAXN], f[MAXN][MAXN]; inline int qpow(int a, int b) { int re = 1; while(b) {
题目链接 题意 求\(\sum_{d|n}\phi (d) \times {n\over d}\),其中\(\phi(n) = n\prod_{p|n}({1-{1\over p}})\) 分析 将\(\phi(d)\) 分解式子代入可知:\(\sum_{d|n}(n\times \prod_{p|d}(1-{1\over p}))\) \(d\) 是 \(n\) 的因子,枚举 \(d\) 的质因子的所有可能的组成情况共\(2^c\)
题面 https://www.luogu.org/problem/P2606 题解 数列按广度优先搜索序搜索,变成一个堆。所以形态是给定的。 只需记忆化搜索就可以了,复杂度$O(logn)$。顺序递推亦可。 对于阶乘超过$p$的情况,我们把$p$的次幂记下来,算的时候直接减去。$aysn$说这是卢卡斯定理,我只能$orz$了。 #incl
Fn = c2n-6 * Fn-1 * Fn-2 * Fn-3,求 Fn . 推一下式子,变成 Fn * cn = ( Fn-1 * cn-1 ) * ( Fn-2 * cn-2 ) * ( Fn-3 * cn-3 ) 记 Tn = Fn * cn,就有 Tn = Tn-1 * Tn-2 * Tn-3 . 再推一下,Tn = Tn-22 * Tn-32 * Tn-4, Tn 的指数就是可以 ( a , b , c ) ----- > ( b+a ,
目录 @description@ @solution@ @accepted code@ @details@ @description@ 请找到满足以下条件的长度为 N 的非负整数序列 A1, A2, ..., AN 的数量。 (1)L≤A1+A2+...+AN≤R。 (2)将 N 个元素排成非增序列后,第 M 个元素要等于第 M + 1 个元素。 请将答案 mod 10^9 + 7。 Constr
题意:\(n\)行\(m\)列的矩阵\((n,m<=3000)\),在格子里搭一些帐篷.每座帐篷必须占据刚好一个格子.没有两座帐篷会占据同一个格子.每座帐篷在东、南、西、北四个方向之一有一个出入口.帐篷的出入口朝向必须满足以下条件:同一行或同一列的两个帐篷的出入口要相对(例如同一行的两个帐篷,
传送门 Description 有 \(q\) 个询问,每个询问给定两个数\(l\) 和\(r\),求 \(a[l:r]\) 的不同子序列的最小值之和 Solution 校内模拟赛用了这道题,但是莫队只能拿\(80\)分,正解是猫树 当然还是莫队啦 考虑一个数加入时的贡献,就是以它为端点的区间的贡献 发现可以将现有的区间
资料出处:https://blog.csdn.net/a_forever_dream/article/details/83654397 https://blog.csdn.net/qaq__qaq/article/details/53812883 基础操作: 定义设数集T的值域范围为[1,2n−1]。T的线性基是T的一个子集A={a1,a2,a3,...,an}。 A中元素互相xor所形成的异或集合,等价于原数集T的
C - Color 参考:CF GYM 100548 Color(2014ACM西安现场赛Problem F) Codeforces Gym 100548F Color (组合数+容斥) 思路:可以参考第一个博客的思路,很容易理解 需要注意的地方:因为数据很大所以一不小心就会爆,所以最好都用 long long ll ans=0; int flag=1; for(int