hdu6038】的更多相关文章

/** 题目:hdu6038 Function 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给定一个a排列[0,n-1],一个b排列[0,m-1]. 定义函数f,定义域为[0,n-1],值域为[0,m-1] 请计算有多少种函数,满足f(i) = bf(ai) 对于每一个i,0<=i<=n-1; f(ai)是b排列的下标.ai表示a排列下标为i的值 两个不同的函数区分是,至少有一个i,f(i)不同于原来的f(i)': 每一个f(i)都…
hdu6038 分析 求函数 \(f\) 的构成方案,\(f\) 确定下来后,\(f\) 和 \(b\) 的值也是一一对应的了( \(f(i)=b_{f(a_i)}\) ),观察 \(a\) 数组,代入 \(f\) 函数,存在循环节,比如 \(a[0] = 1, a[1] = 0\),那么循环节长度为 2,代入后,\(f(0)=b_{f(1)}, f(1)=b_{f(0)}\),也能形成类似的循环节,正好是前面循环节的长度(后面我们直接去考虑对应 \(a\) 数组的循环节就好了).观察 \(b\…
/*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL; ; const int inf=0x3f3f3f3f; ; ,maxlop; ],b[],mark[]; LL Arep[],Brep[]; LL fastpow(LL a,LL b){ LL ret=,x=a; while(b){ ){ ret=(ret*x)%mod; } x=(x*x)%mod; b…
链接  http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意: 给你一个a序列,代表0到n-1的排列:一个b序列代表0到m-1的排列.问你可以找出多少种函数关系f,f的定义域内的i都满足f(i)=b[f(a[i])]; 分析:这个主要是找循环节 循环节导致函数有多种情况 找到每段循环节的 取值 种数 相乘起来就是答案比如说:如果 a 序列是 2 0 1 那么我们可以发现 f[0] = b[f(a[0])]     f[0]  = b[f(2)] f[…
把b数组的所有置换群求出来,用数组记录一下每个大小所出现的次数. 然后求a的置换群,对每个置换群求能被其整除的b的置换群的大小总和(只有这些才能满足构造出一个f,且不自相矛盾),然后把它们全都乘起来就是答案. #include<cstdio> #include<cstring> using namespace std; typedef long long ll; #define MOD 1000000007ll int n,m,a[100010],b[100010],zu; boo…
传送门 题意 给出一个\(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\)的因子时才满足上述函数(请注意观察公式及结…
解法:这道题很有意思,值得一做和细细思考. 首先是我们要观察这个映射公式,他的实质是什么?其实就是b到a的循环映射,这是因为a数列和b数列都是0-n-1的排列,意味着每个数都是唯一的,那么ab的这个循环映射就是循环的封闭的不会影响到其他数.这样的话b到a的映射就形成了一个个的循环节. 那么我们考虑先分别把a数组和b数组的循环节找出来,此时我们要思考怎样才能满足这样的循环映射呢? 答案就是a的循环节大小要是b循环节大小的倍数!!!这个有点难解释,如果不是倍数关系的话会出现:b开始映射a,b的第一轮…
/* 引理:[0,n-1]的排列,i向a[i]连边,那么每个数必定在一个环中 所以数组a可以分割成一些环,数组b也可以分割成一些环 先讨论a的一个环 a[a1]=a2 a[a2]=a3 a[a3]=a4 a[a4]=a5 a[a5]=a6 a[a6]=a1 这个环长度为6 那么套到函数 f[i]=b[ f[a[i] ]中 f[a1]=b[f[a2]] f[a2]=b[f[a3]] f[a3]=b[f[a4]] f[a4]=b[f[a5]] f[a5]=b[f[a6]] f[a6]=b[f[a1]…
1001 Add More Zero(签到题) 题目链接 HDU6033 Add More Zero 找出最大的k,使得\(2^m-1\ge 10^k\). 直接取log,-1可以忽略不计. #include <cstdio> #include <cmath> int cas,m; int main(){ while(~scanf("%d",&m)){ printf("Case #%d: %d\n",++cas,(int)(m*log…