2017 Multi-University Training Contest
来源:互联网 发布:腾讯上班知乎 编辑:程序博客网 时间:2024/05/29 18:56
http://acm.hdu.edu.cn/showproblem.php?pid=6038
题意:
给你一个a序列,代表0到n-1的排列;一个b序列代表0到m-1的排列。问你可以找出多少个满足f(i)=b[f(a[i])];
思路:
赛后发现其实只要找出序列a和序列b分别有多少个是成环的,并且环内的元素相模为0的话,将他们乘起来然后相加即可得到答案。
#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000007#define MAXN 1000005bool vis[MAXN];int a[MAXN],b[MAXN];int aa[MAXN],bb[MAXN];int main(){ int n,m; int cas = 1; while(~scanf("%d %d",&n,&m)){ int maxa,maxb; maxa = maxb = 0; memset(aa,0,sizeof(aa)); memset(bb,0,sizeof(bb)); for(int i = 0;i < n;i++){ scanf("%d",&a[i]); } for(int i = 0;i < m;i++){ scanf("%d",&b[i]); } memset(vis,false,sizeof(vis)); for(int i = 0;i < n;i++){ int cont = 0; int x = i; while(!vis[x]){ vis[x] = true; cont++; x = a[x]; } maxa = max(maxa,cont); aa[cont]++; }// for(int i = 1;i <= maxa;i++){// printf("aa[%d] = %d\n",i,aa[i]);// } memset(vis,false,sizeof(vis)); for(int i = 0;i < m;i++){ int cont = 0; int x = i; while(!vis[x]){ vis[x] = true; cont++; x = b[x]; } maxb = max(maxb,cont); bb[cont]++; }// for(int i = 1;i <= maxb;i++){// printf("bb[%d] = %d\n",i,bb[i]);// } ll sum = 1; for(int i = 1;i <= n;i++){ if(aa[i]){ ll ans = 0; for(int j = 1;j <= i;j++){ if(i % j == 0){ ans = (ans + bb[j] * j) % mod;// if(j * j != i){//// printf("%d %d\n",i,j);// ans = (ans + bb[i / j] * (i / j)) % mod;//// printf("b[i / j] = %d,i / j = %d\n",bb[i / j],i / j);// } } } while(aa[i]--){ sum = sum * (ans) % mod; } } } printf("Case #%d: %lld\n",cas++,sum); }}
阅读全文
0 0
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- #2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- #2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- c++中map容器的使用
- 2298: [HAOI2011]problem a
- 对象的深浅拷贝方法
- VMWare安装linux系统
- 2134: 单选错位
- 2017 Multi-University Training Contest
- 1174: [Balkan2007]Toponyms
- HDU 5094 Maze & HDU 4845 拯救大兵瑞恩 (BFS + 状压)
- 深入理解计算机操作系统(2.1.1、2.1.2)
- WebGIS学习(五)-WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图
- 1295: [SCOI2009]最长距离
- 待学事项
- JSON书写格式
- 凸分析(1)