[agc008E]Next or Nextnext-[dp+思考题]
Description
Solution
然后我谈下个人理解。由于我们的两个条件只要任意满足,则在p的图中i有两种连边法:i->p[i],i->p[p[i]]。
我们考虑在a的图中i->a[i]。可得我们要把p图塞到a图里。
具体分析看题解吧,题解图画的很清晰呀。然后。。就各种dp+乱搞了。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod=1e9+;
int n,x;
int a[];
int in[],col[],cir[];
int len[],cnt[];
ll dp[],ans=;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=n;i++)
{
in[a[i]]++;
x=i;while (!col[x]) {col[x]=i;x=a[x];}
if (col[x]!=i) continue;
while (!cir[x]) {cir[x]=i;x=a[x];}
}
for (int i=;i<=n;i++)
if ((cir[i]&&in[i]>)||(!cir[i]&&in[i]>)) return printf(""),; int js;
for (int i=;i<=n;i++)
{
if (in[i]) continue;
x=i;js=;
while (!cir[x]) {js++;x=a[x];}
len[x]=js;
}
int _len,fir,st,id;
for (int i=;i<=n;i++)
{
if (!cir[i]) continue;
x=i;
_len=fir=st=id=;
for(;cir[x];x=a[x])
{
id++;cir[x]=;
if(len[x])
{
if (!fir){fir=st=id;_len=len[x];}
else
{
ans=ans*((len[x]<id-st)+(len[x]<=id-st))%mod;
if (!ans) return printf(""),;st=id;
}
}
}
if (fir)
{
ans=ans*((_len<id+fir-st)+(_len<=id+fir-st))%mod;
if (!ans)return printf(""),;
}
else cnt[id]++;
}
for (int i=;i<=n;i++)
{
if (!cnt[i]) continue;
dp[]=;
if (i>&&i%)
for (int j=;j<=cnt[i];j++)
{
dp[j]=dp[j-]*%mod;
if (j>) dp[j]=(dp[j]+dp[j-]*(j-)*i%mod)%mod;
} else
for (int j=;j<=cnt[i];j++)
{
dp[j]=dp[j-];
if (j>) dp[j]=(dp[j]+dp[j-]*(j-)*i%mod)%mod;
}
ans=ans*dp[cnt[i]]%mod;
if (!ans) return printf(""),;
}
cout<<ans;
}
[agc008E]Next or Nextnext-[dp+思考题]的更多相关文章
- [AGC008E] Next or Nextnext [环套树森林+结论讨论]
题面 传送门 思路 p到a 首先,本题中如果对于所有的$i$,连边$<i,p_i>$,那么可以得到一批环 那么这个题另外一点就是,可以变成连边$<i,p_{p_i}>$ 我们分 ...
- AGC008E Next or Nextnext(组合计数,神奇思路)
神仙题. 排列计数,一种常见的做法是 \(i\) 向 \(p_i\) 连边. 然而这里这个就逼迫我们只能从 \(i\) 向 \(a_i\) 连边. 不过没关系,考虑从 \(i\) 向 \(p_i\) ...
- @atcoder - AGC008E@ Next or Nextnext
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个长度为 N 的序列 a,问有多少排列 p,满足对于每一个 ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- NOIp2018模拟赛四十
今天太晚了...题解到时候补吧(flag立好) 成绩:100+0+0=100 感觉A题本质暴力贪心?C题一道水题我居然没做...亏爆 A:[agc011e]increasing numbers B:[ ...
- AGC008E:Next or Nextnext
传送门 考虑转化成图论问题,\(i\) 向 \(p_i\) 连边,那么合法方案一定是形成了若干个简单环或自环 考虑一个环内的情况: 如果 \(a_i=p_i\),那么 \(i\) 向 \(a_i\) ...
- [agc011F]Train Service Planning-[线段树优化dp+神秘思考题]
Description 传送门 Solution 请围观lhx大佬的博客(大佬写的太好了我都没有写的动力了em) Code #include<iostream> #include<c ...
- hdu4939 Stupid Tower Defense (DP)
2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131 ...
- POJ2677 Tour(DP+双调欧几里得旅行商问题)
Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3929 Accepted: 1761 Description ...
随机推荐
- selenium模拟鼠标操作
Selenium提供了一个类ActionChains来处理模拟鼠标事件,如单击.双击.拖动等. 基本语法: class ActionChains(object): """ ...
- Oracle EBS 验证应收是否等于加税
--To validate whether a transaction's REC is equal to its REV plus TAX or not --验证应收是否等于收入加税 SELECT ...
- 第八章 SQL高级处理 8-2 GROUPING运算符
一.同时得到合计行 合计行是不指定聚合键时得到的汇总结果. UNION ALL与UNION的不同之处是它不会对结果进行排序,因此比UNION性能更好. 二.ROLLUP——同时得出合计和小计 GR ...
- 数据库复制 Nacicate Premium
之前都是“备份-还原”,抑或“导出-导入”.今天在将SqlServer中的数据导入到MySql中时发现了一个非常方便的方法,无需任何繁琐的配置和操作.废话少说,进入正题: 工具:Navicat Pre ...
- Spring中的统一异常处理方式
源自:https://segmentfault.com/a/1190000016236188 在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此, ...
- Redis学习---Redis的免密操作
Redis的免密操作 问题解决[方式一]:当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效 1.首先进入redis,如果没有开启redis则需要先开启: [r ...
- Linux基础优化和安全重点小结
Linux基础优化和安全重点小结 1.不用root管理,以普通用户的名义通过sudo管理授权(/etc/sudoers) 2.更改默认的ssh服务端口,禁止root用户远程连接,甚至监听 ...
- 清除右键菜单CMD入口
批处理代码 reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\cmd" /v Extended /t REG_SZ
- Hadoop HBase概念学习系列之模式设计(十)
Hbase与RDBMS的区别在于:HBase的Cell(每条数据记录中的数据项)是具有版本描述的(versioned),行是有序的,列(qualifier)在所属列簇(Column familie ...
- 3星|《结构思考力》:用金字塔原理整理PPT的思路,案例偏简单
结构思考力 名义上全书是讲结构化思考,实际内容是用结构化思考的方法来整理PPT的思路,让PPT的逻辑更清晰.少部分提到如何修改标题更吸引人,如何做图表设计. 书中结构化思考的基本思路,重要的有两个:1 ...