传送门

题意

给出一个\(0\sim n-1\)的排列a,一个\(0\sim {m-1}\)的排列b,询问满足$$f(i)=b_{f(a_i)}~~(0\le i\le n-1)$$的函数的个数

分析

由于 \(f(i) = b_{f(a_i)} = b_{b_{f(a_{a_i})}} = \underbrace{b_{\cdots b_{f(i)}}}_{l\text{ times }b}\),我们发现a中的l个数构成了循环群,而只有当\(j为l\)的因子时才满足上述函数(请注意观察公式及结合样例),j为排列b中循环节的长度,l为排列a中循环节的长度。

故先与处理出a和b的拥有的循环群长度及数目。

最终答案为$$\prod_{i=1}^{k}\sum_{j\mid l_i}num[j]*j$$(请仔细思考)

a中每种循环节都是单独的,而a中循环节对应的b中的循环节则要相加

相关题解

trick

代码

#include <bits/stdc++.h>
using namespace std; #define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a)) const ll mod = 1e9+7; int n,m;
int a[1000100],b[100100];
int numa[100100],numb[100100];
int vis[100100];
ll ans,ret; void dfs1(int loc,int k)//统计a中循环群长度及数目
{
if(vis[loc]) {numa[k]++;return ;}
vis[loc]=1;
dfs1(a[loc],k+1);
}
void dfs2(int loc,int k)//统计b中循环群长度及数目
{
if(vis[loc]) {numb[k]++;return ;}
vis[loc]=1;
dfs2(b[loc],k+1);
} int main()
{
int tot=0;
while(scanf("%d %d",&n,&m)!=EOF)
{
R(i,0,n) scanf("%d",a+i);
R(i,0,m) scanf("%d",b+i);
mem(vis,0);mem(numa,0);
R(i,0,n) if(!vis[i]) dfs1(i,0);
mem(vis,0);mem(numb,0);
R(i,0,m) if(!vis[i]) dfs2(i,0);
//F(i,1,n) printf("%d %d\n",numa[i],numb[i] );
ans=1;
for(int i=1;i<=n;++i) if(numa[i])//枚举a中循环群长度
{
ret=0;int len=(int)sqrt(i+0.5);
for(int j=1;j<=len;++j)if(i%j==0)//找到b中为a中循环群长度因子的循环群
{
ret=(ret+1LL*numb[j]*j%mod)%mod;
if(j*j!=i) ret=(ret+1LL*numb[i/j]*(i/j)%mod)%mod;
}
for(int j=1;j<=numa[i];++j) ans=ans*ret%mod;//a中有numa[i]个长度为i的循环群,注意取模
}
printf("Case #%d: %I64d\n",++tot,ans );
}
return 0;
}

HDU6038:Function(循环群/节+找公式)的更多相关文章

  1. HDU-6038 Function 思维+循环节

    解法:这道题很有意思,值得一做和细细思考. 首先是我们要观察这个映射公式,他的实质是什么?其实就是b到a的循环映射,这是因为a数列和b数列都是0-n-1的排列,意味着每个数都是唯一的,那么ab的这个循 ...

  2. hdu6038 Function 函数映射

    /** 题目:hdu6038 Function 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给定一个a排列[0,n-1],一个b排列[0, ...

  3. hdu 3054 Fibonacci 找循环节的公式题

    Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Proble ...

  4. 感恩节MathType公式编辑器6折优惠启动

    MathType是由美国Design Science公司开发功能强大的公式编辑器,专门用来对数学公式的编辑,与常见的文字处理软件和演示程序配合使用,能够在各种文档中加入复杂的数学公式和符号.感恩节期间 ...

  5. hdu4696 Answers(循环节+找规律)

    题意: 分析: 容易想到先把T数组按位置和对应权值建一个有向图(类似置换群那种指法) 然后图建完了,如果C[]里面都是2,那显然只能凑出那些偶数,奇数是不能凑出来的 如果C[]有1有2呢? 事实上是可 ...

  6. 【置换群】【枚举约数】hdu6038 Function

    把b数组的所有置换群求出来,用数组记录一下每个大小所出现的次数. 然后求a的置换群,对每个置换群求能被其整除的b的置换群的大小总和(只有这些才能满足构造出一个f,且不自相矛盾),然后把它们全都乘起来就 ...

  7. HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. [数]青蛙的约会&Strange function

    拓展欧几里得:求导&二分 POJ-1061 拓展欧几里得的应用,需要开long long 第一次做这个题的时候进行了毫无用处的找公式(?),是个现在的我看不懂的迷之思路. 第二发的时候还是不明 ...

  9. 第10.1节 Python的模块及模块导入

    一. 什么是模块 Python中的模块即单个的Python代码文件,为什么称为模块呢?这是因为在Python中,每个独立的Python文件都可以作为被其他代码导入的模块使用,导入的模块有自己的名字空间 ...

随机推荐

  1. Solidworks如何将参考平面的图形投影到某曲面上

    1 画好草图,点击曲线-分割线   2 选择要投影的草图和被投影的面(那个球面),最后效果如下图所示   3 为了获取连续的轨迹,我们可以再次选择这个草图,然后在投影面中选择平面,最后得到的图形如下图 ...

  2. Variable 'bop' is uninitialized when captured by block

    代码: - (void)doTest { NSBlockOperation * bop = [NSBlockOperation blockOperationWithBlock:^{ if (!bop. ...

  3. Table tr 的隔行变色

    <style type="text/css">    table{border-collapse:collapse;border:1px solid #999;} td ...

  4. PostgreSQL 源码解读 node的模拟实现

      node的实现是PostgreSQL的查询解析的基础,实现的关键是两个宏,makeNode和newNode.其他节点继承自Node节点,如果增加新的结构体,需要添加NodeTag中添加对应的枚举值 ...

  5. Raspberry Pi For Windows

    Raspberry Pi ------For Windows Step 1: In order to write the image for SD,we should download and ins ...

  6. MySQL(6)--复制,docker容器中

    MySQL5.7.11实现replication 启动两个安装好mysql的空的docker image ----------------- shell1  master $docker run -i ...

  7. Ctrl+Enter 选中文本提交

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <bod ...

  8. eclipse通过maven建立java se工程配置log4j,打包成zip,将jar包和配置文件分开,并以bat和sh文件启动java程序

    一.新建maven的java工程 1.eclipse里file-new-other,选择maven Project 2.选中 Use default Workspace location,然后 nex ...

  9. python day 13 生成器 以及 推导式

    1.生成器的本质是迭代器 2.生成器函数 def  fn() 函数体 yield fn() g = fn() 此时这个g就是生成器 所以g 是可迭代的 g._ _next_ _ 每执行一次_ _nex ...

  10. A toolbox to build your own build server

    A toolbox to build your own build server LambdaCD - Build Pipelines as Code https://www.lambda.cd/ A ...