Solution -「NWRRC 2017」「洛谷 P7024」Fygon 2.0
\(\mathcal{Description}\)
Link.
给定一个无并列语句的多重循环,每个变量取值的左端点只能是 \(1\) 或已定义的变量;右端点只能是 \(n\) 或已定义的变量。求循环语句关于 \(n\) 的复杂度以及常数。
循环语句数量 \(m<20\)。
\(\mathcal{Solution}\)
按变量的偏序关系建图,缩掉 SCC——它们的取值必然相等,设有 \(s\) 个 SCC,那么循环的复杂度显然是 \(\mathcal O(n^s)\),难点在于求常数。
第一步转化是平凡的:我们可以钦定变量间的严格偏序而忽略取等的情况。这是因为当某两个变量取等时,不会对计算次数的最高次产生贡献。此外,我们还能得知在变量都取 \([1,n]\),但被限制偏序时,一共有 \(s!\binom{n}{s}\) 种取值组。
第二步,利用缩点得到的 DAG 的性质,可以发现:在严格偏序意义下,满足 DAG 限制的变量组数量等于对 DAG 拓扑排序的方案数。 证明是平凡的。设方案数为 \(c\),由此可知 \(\frac{c}{s!}\) 即循环的常数因子。
求解复杂度为 \(\mathcal O(2^mm^2)\),瓶颈是状压求拓扑方案数。也许能优化 awa。(
\(\mathcal{Code}\)
/*+Rainybunny+*/
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef long long LL;
inline void chkmin( int& u, const int v ) { v < u && ( u = v ); }
inline LL gcd( const LL u, const LL v ) { return v ? gcd( v, u % v ) : u; }
const int MAXN = 20;
int n, adj[MAXN + 5], vad[MAXN + 5], ref[256];
int scc, dfc, dfn[MAXN + 5], low[MAXN + 5], bel[MAXN + 5];
LL f[1 << MAXN];
inline void tarjan( const int u ) {
static int stk[MAXN + 5], top;
static bool instk[MAXN + 5];
instk[stk[++top] = u] = true, dfn[u] = low[u] = ++dfc;
rep ( v, 0, n - 1 ) if ( adj[u] >> v & 1 ) {
if ( !dfn[v] ) tarjan( v ), chkmin( low[u], low[v] );
else if ( instk[v] ) chkmin( low[u], dfn[v] );
}
if ( dfn[u] == low[u] ) {
int v;
do instk[v = stk[top--]] = false, bel[v] = scc; while ( v != u );
++scc;
}
}
int main() {
freopen( "fygon20.in", "r", stdin );
freopen( "fygon20.out", "w", stdout );
scanf( "%d%*c", &n ), --n;
if ( !n ) return puts( "0 1/1" ), 0;
rep ( i, 0, n - 1 ) {
static char str[200]; int st = i << 2;
scanf( "%[^\n]%*c", str ), ref[str[st + 4]] = i;
if ( str[st + 15] != '1' ) adj[i] |= 1 << ref[str[st + 15]];
if ( str[st + 18] != 'n' ) adj[ref[str[st + 18]]] |= 1 << i;
}
rep ( i, 0, n - 1 ) if ( !dfn[i] ) tarjan( i );
rep ( u, 0, n - 1 ) rep ( v, 0, n - 1 ) {
if ( adj[u] >> v & 1 && bel[u] != bel[v] ) {
vad[bel[u]] |= 1 << bel[v];
}
}
f[0] = 1;
rep ( S, 0, ( 1 << scc ) - 2 ) {
rep ( u, 0, scc - 1 ) if ( ~S >> u & 1 ) {
bool flg = true;
rep ( v, 0, scc - 1 ) {
flg &= !( v != u && ~S >> v & 1 && vad[v] >> u & 1 );
if ( !flg ) break;
}
if ( flg ) f[S | 1 << u] += f[S];
}
}
LL fac = 1;
rep ( i, 1, scc ) fac *= i;
LL d = gcd( fac, f[( 1 << scc ) - 1] );
printf( "%d %lld/%lld\n", scc, f[( 1 << scc ) - 1] / d, fac / d );
return 0;
}
Solution -「NWRRC 2017」「洛谷 P7024」Fygon 2.0的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
随机推荐
- mysql 5.7.29 在centos7.6下超简单的本地yum源安装与配置
目录 生成yum源元数据 从网易镜像站下载MySQL 5.7 的 bundle包 创建文件 mysql-local.repo 执行yum install命令 生成yum源元数据 createrepo ...
- 用软碟通UltraISO刻录Win 10 1909 到U盘,只有1个G左右,安装不了系统
之前一直用软碟通刻录WIN10的ISO镜像到U盘.最近想到用最新版的WIN10 1909 来做一个U盘系统,刻录也成功了.就是安装系统的时候总报错,找了很久原因,终于发现刻录后占用U盘的空间只有1G左 ...
- 解压安装Cacti在apache中的补充
如果你不是安装 Cacti 到 Apache 默认的网络目录文件夹位置,那么在 /etc/httpd/conf.d 中新增配置文件 cacti.conf,并且按如下内容编辑.设置 /your/cact ...
- 生产环境上,哨兵模式集群Redis版本升级应用实战
背景: 由于生产环境上所使用的Redis版本并不一致,好久也没有更新,为了避免版本不同对Redis集群造成影响,从而升级为统一Redis版本! 1.集群架构 一主两从三哨兵: 2.升级方案 (1)升级 ...
- Flowable实战(五)表单和流程变量
一.流程变量 流程实例按步骤执行时,需要保存并使用一些数据,在Flowable中,这些数据称为变量(variable). 流程实例可以持有变量,称作流程变量(process variables ...
- 一个小程序:Instrumentation的使用
本来是想练习Matrix的,没想到写了一个自定义View,监听它的ASWD键后,不知道该如何按下ASWD(手机上一般都没实体按键了).于是: 一个自定义View: public class MyVie ...
- [USB波形分析] 全速USB波形数据分析(一)
在之前的文章一次CAN波形分析之旅里,根据示波器采集的波形数据,详细地分析了CAN通信.今天来分析USB数据,还是同样的流程,但是这次使用matplotlib来协助分析. USB基本波形 USB通过一 ...
- 只要一行代码,实现五种 CSS 经典布局
常用的页面布局,其实就那么几个.下面我会介绍5个经典布局,只要掌握了它们,就能应对绝大多数常规页面. 这几个布局都是自适应的,自动适配桌面设备和移动设备.代码实现很简单,核心代码只有一行,有很大的学习 ...
- mysql加强(3)~分组(统计)查询
一.分组(统计) 查询 1.语法 : select [distinct] *| 分组字段1[别名] [,分组字段2[别名],...] | 统计函数 from 表名 [别名] [where 条件(s)] ...
- python组合
目录 一:组合基础使用 二:组合 一:组合基础使用 组合: 就是一个对象拥有一个属性,该属性的值是另一个对象 继承:满足什么是什么的关系,is-a的关系 继承是一把双刃剑,单继承能实现就尽量少的继承, ...