HDU

来源:互联网 发布:漫威电影观看顺序 知乎 编辑:程序博客网 时间:2024/06/03 20:13

思路:求出a和b中各个循环的长度。要使a中的某个循环满足,那么b中必须存在一个循环它的长度为a的因子,因为只有b中循环长度是a中的因子,才能被a整除,最后a置换回来才不变。

#include<cstdio>#include<set>#include<algorithm>#include<cstring>#include<iostream>#include<map>#include<queue>#include<vector>#include<stack>#include<string>#include<sstream>#include<set>#include<cmath>using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 1e5 + 20;const double EPS = 1e-5;const int mod = 1e9 + 7;typedef unsigned long long ull;typedef long long LL;int dx[] = {0, 0, -1, 1, -1, -1, 1, 1};int dy[] = {1, -1, 0, 0, -1, 1, -1, 1};int n, m;vector<int> va, vb;int vis[maxn];int a[maxn], b[maxn];int main(){    int kase = 0;    while(scanf("%d%d", &n, &m) == 2){        va.clear();        vb.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]) continue;            int cnt = 1, v = a[i];            vis[i] =  1;            while(v != i){                vis[v] = 1;                cnt++;                v = a[v];            }            va.push_back(cnt);        }        memset(vis, 0, sizeof vis);        for(int i = 0; i < m; ++i){            if(vis[i]) continue;            int cnt = 1, v = b[i];            vis[i] =  1;            while(v != i){                vis[v] = 1;                cnt++;                v = b[v];            }            vb.push_back(cnt);        }        LL ans = 1;        for(int i = 0; i < va.size(); ++i){            int sum = 0;            for(int j = 0; j < vb.size(); ++j){                if(va[i] % vb[j] == 0){                    sum += vb[j];                }            }            ans = ans * sum % mod;        }        printf("Case #%d: %lld\n", ++kase, ans);    }}