zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
  • 相关阅读:
    服务器
    python的并发编程学习
    python的网络编程学习
    python的基础学习 模块
    pymysql基础操作
    查询简单练习
    数据准备
    数据库的三大设计范式
    数据库基础-建表约束
    mysql基础-基本语法
  • 原文地址:https://www.cnblogs.com/UnderSilenceee/p/7295997.html
Copyright © 2011-2022 走看看