hdu6038[找规律+循环节] 2017多校1

/*hdu6038[找规律+循环节] 2017多校1*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps=1e-8;
const int inf=0x3f3f3f3f;
const int mod=1000000007;
int n,m,lop,kase=1,maxlop;
int a[100005],b[100005],mark[100005];
LL Arep[100005],Brep[100005];
LL fastpow(LL a,LL b){
    LL ret=1,x=a;
    while(b){
        if(b&1){
            ret=(ret*x)%mod;
        }
        x=(x*x)%mod;
        b>>=1;
    }
    return ret;
}
void dfs(int now,int dps){
    if(mark[now]){
        Arep[dps]++;
        return;
    }
    mark[now]=1;
    dfs(a[now],dps+1);
}
void dfs2(int now,int dps){
    if(mark[now]){
        Brep[dps]++;
        return;
    }
    mark[now]=1;
    dfs2(b[now],dps+1);
}
void solve(){
    maxlop=0;
    for(int i=0;i<n;i++){
        if(!mark[a[i]]){
            dfs(i,0);
        }
    }
    memset(mark,0,sizeof(mark));
    for(int i=0;i<m;i++){
        if(!mark[b[i]]){
            dfs2(i,0);
        }
    }
    memset(mark,0,sizeof(mark));
    LL ans=0,sum=1;
    for(int i=1;i<=n;i++){
        if(Arep[i]){
            ans=0;
            for(int j=1;j*j<=i;j++){
                if(i%j==0){
                    ans=(ans+(Brep[j]%mod)*(j%mod))%mod;
                    if(j*j!=i){
                        ans=(ans+(Brep[i/j]%mod)*((i/j)%mod))%mod;
                    }
                }
            }
            sum=(sum*fastpow(ans,Arep[i]))%mod;
        }
    }
    printf("Case #%d: %lld\n",kase++,sum);
}
int main(){
    //freopen("1006.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(~scanf("%d%d",&n,&m)){
        memset(mark,0,sizeof(mark));
        memset(Arep,0,sizeof(Arep));
        memset(Brep,0,sizeof(Brep));
        for(int i=0;i<n;scanf("%d",&a[i]),i++);
        for(int i=0;i<m;scanf("%d",&b[i]),i++);
        solve();
    }
    return 0;
}

 

posted @ 2017-08-06 21:09 UnderSilence 阅读(...) 评论(...) 编辑 收藏