HDU 6038 函数问题

本文探讨了一个复杂的函数计数问题,给定两个排列序列a和b,寻找满足特定条件的函数数量。通过对序列循环特性的深入分析,提出了一种有效的解决策略,并通过代码实现了算法。

Function

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1649    Accepted Submission(s): 773


Problem Description
You are given a permutation a from 0 to n1 and a permutation b from 0 to m1.

Define that the domain of function f is the set of integers from 0 to n1, and the range of it is the set of integers from 0 to m1.

Please calculate the quantity of different functions f satisfying that f(i)=bf(ai) for each i from 0 to n1.

Two functions are different if and only if there exists at least one integer from 0 to n1 mapped into different integers in these two functions.

The answer may be too large, so please output it in modulo 109+7.
 

Input
The input contains multiple test cases.

For each case:

The first line contains two numbers n, m(1n100000,1m100000)

The second line contains n numbers, ranged from 0 to n1, the i-th number of which represents ai1.

The third line contains m numbers, ranged from 0 to m1, the i-th number of which represents bi1.

It is guaranteed that n106, m106.
 

Output
For each test case, output "Case #xy" in one line (without quotes), where x indicates the case number starting from 1 and y denotes the answer of corresponding case.
 

Sample Input
3 2 1 0 2 0 1 3 4 2 0 1 0 2 3 1
 

Sample Output
Case #1: 4 Case #2: 4
 

题意:

给你一个a序列,代表0到n-1的排列;一个b序列代表0到m-1的排列。问你可以找出多少种函数关系,满足f(i)=b[f(a[i])]; 
分析:这个主要是找循环节 
比如说:如果 a 序列是 2 0 1 那么我们可以发现

f(0) = b[f(a[0])] = b[f(2)] 
f[1] = b[f(a[1])] = b[f(0)] 
f[2] = b[f(a[2])] = b[f(1)]

那么f(0) f(1) f(2) 也是循环的 如果想找出这样的函数,必须值域里也存在同样长度的循环节或者存在其约数长度的循环节。 
那么就是找两个序列的循环节,对于定义域里面的每一个循环节都找出来有多少种和他对应的。最后乘起来就是答案了

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define ll long long
#define mod 1000000007
#define N 100050

vector<int>vec;
vector<int>F[N];

void init(){
	for(int i = 1;i <= N - 10;i++){
		for(int j = i;j <= N - 10;j += i){
			F[j].push_back(i);
		}
	}
}

int a[N],b[N],vis[N],blen[N];

int dfs(int x,int *p){
	if(vis[x])
		return 0;
	vis[x] = 1;
	return dfs(p[x],p) + 1;
}

int main(){
	int n,m,Case = 1;
	init();
	while(scanf("%d %d",&n,&m) != EOF){
		vec.clear();
		for(int i = 0;i < n;i++){
			scanf("%d",&a[i]);
		}
		for(int i = 0;i < m;i++){
			scanf("%d",&b[i]);
		}
		memset(vis,0,sizeof(vis));
		for(int i = 0;i < n;i++){
			if(!vis[i]){
				vec.push_back(dfs(i,a));
			}
		}
		memset(vis,0,sizeof(vis));
		memset(blen,0,sizeof(blen));
		for(int i = 0;i < m;i++){
			if(!vis[i]){
				blen[dfs(i,b)]++;
			}
		}
		ll ans = 1;
		for(int i = 0;i < vec.size();i++){
			ll temp = 0;
			for(int j = 0;j < F[vec[i]].size();j++){
				temp += F[vec[i]][j] * blen[F[vec[i]][j]];
				temp %= mod;
			}
			ans *= temp;
			ans %= mod;
		}
		printf("Case #%d: %lld\n",Case++,ans);
	}
}


源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值