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);    }}
原创粉丝点击