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);
	}
}


基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值