2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 652 Accepted Submission(s): 267
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
Source
2017 Multi-University Training Contest - Team 1
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6038
分析:
题目大意:
给你一个数组A,和一个数组B,数组A是【0~n-1】的排咧,数组B是【0~m-1】的排列。
现在定义F(i)=bF(ai);
问有多少种取值,使得F(i)全部合法。
样例1可行的解:
110
111
001
000
分析:
写出样例2的公式:
①F(0)=bF(2)
②F(1)=bF(0)
③F(2)=bF(1)
我们不难发现,如果我们设定了F(0)的值,就能够通过式子②能够得知F(1)的值,然后就能通过式子③得知F(2)的值,最后再回归式子①尝试当前设定的值是否合法了。
这就是一个循环节
我们对于A数组中的一个环的话如果一个环中的任意一个点的价值我们能够设定出来,那么这一个循环节的所有点的值就都能够知道了。
然而这个能够设定的值,肯定是数组B中的一个值,而且我们已知都是循环节,那么数组B中的这个被选中设定的值也一定存在一个循环节,而且这个循环节的长度,一定是A长度循环节的因子长度。
A数组中长度为D的一个循环节,如果B数组中有一个循环节的长度为d,并且如果D%d==0.那么这个B数组的这个循环节的所有值,都可以作为A数组中这个循环节的值。那么对于A数组中的这个循环节来讲,答案数就多了d个。
过程统计每个循环节能够满足的答案的个数,然后累乘即可。
下面给出AC代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int maxn=100010;
4 const int mod=1000000007;
5 int n,m,ans=1;
6 int a[maxn],b[maxn];
7 int cal[2][maxn];
8 bool vis[maxn];
9 inline void DFS(int t,int l,int *a,int k)
10 {
11 if(vis[t])
12 {
13 cal[k][l]++;
14 return;
15 }
16 vis[t]=1;
17 DFS(a[t],l+1,a,k);
18 }
19 int main()
20 {
21 int tcase=1;
22 while(scanf("%d%d",&n,&m)!=EOF)
23 {
24 for(int i=0;i<n;i++)
25 scanf("%d",&a[i]);
26 for(int i=0;i<m;i++)
27 scanf("%d",&b[i]);
28 memset(cal,0,sizeof(cal));
29 memset(vis,false,sizeof(vis));
30 for(int i=0;i<m;i++)
31 {
32 if(!vis[i])
33 DFS(i,0,b,0);
34 }
35 memset(vis,false,sizeof(vis));
36 for(int i=0;i<n;i++)
37 {
38 if(!vis[i])
39 DFS(i,0,a,1);
40 }
41 ans=1;
42 for(int i=1;i<=n;i++)
43 {
44 if(cal[1][i])
45 {
46 int lim=(int)sqrt(i+0.5);
47 int ta=0;
48 for(int j=1;j<=lim;j++)
49 {
50 if(i%j==0)
51 {
52 (ta+=(long long)cal[0][j]%mod*j%mod)%=mod;
53 if(j*j!=i)
54 (ta+=(long long)cal[0][i/j]%mod*(i/j)%mod)%=mod;
55 }
56 }
57 for(int j=1;j<=cal[1][i];j++)
58 {
59 ans=(long long)ans*ta%mod;
60 }
61 }
62 }
63 printf("Case #%d: %dn",tcase++,ans);
64 }
65 return 0;
66 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 获取电脑真实的IP地址,忽略虚拟机等IP地址的干扰
- K8S系列之K8S集群之Master节点部署
- Kafka集群搭建
- Kafka的实现细节
- CentOS7下安装Elasticsearch-7.3.2和Elasticsearch-head
- spring boot oauth2 取消认证
- 日志级别记录规范
- 搭建K8S集群之node节点部署
- ent orm笔记2---schema使用(上)
- ent orm笔记4---Code Generation
- 什么?明明是2020年12月30日显示2021年12月30日?
- JDK1.8HashMap源码学习-数据结构
- JDK1.8HashMap源码学习-初始化
- JDK1.8HashMap源码学习-put操作以及扩容(一)
- 数据科学家极力推荐核心计算工具-Numpy的前世今生(上)