zoukankan      html  css  js  c++  java
  • 2017 Multi-University Training Contest 6.Function(图论)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6038

    分析:实际上a序列对应一个图,由于是一个排列,保证了图是由若干个互不相交的环组成的,所求的函数实际上也是这样的图。只要a的某个环大小k是函数环的大小的因子,就对应k种取法,然后对不同环乘法原理一下即可。最坏复杂度很高,不过数据不强,就过了。。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<vector>
     5 using namespace std;
     6 const int maxn=1e5+5,mod=1e9+7;
     7 int a[maxn],b[maxn],n,m;
     8 int p[maxn],num[maxn],t[maxn];
     9 bool have[maxn];
    10 vector<int> v,k;
    11 int Find(int x){return x==p[x]?x:p[x]=Find(p[x]);}
    12 int gcd(int a,int b){
    13     return a==0?b:gcd(b%a,a);
    14 }
    15 int main(){
    16     //freopen("e:\in.txt","r",stdin);
    17     int kase=0;
    18     while(scanf("%d%d",&n,&m)!=EOF){
    19         int ans=1;
    20         v.clear();
    21         k.clear();
    22         for(int i=0;i<n;i++)
    23             scanf("%d",&a[i]);
    24         for(int i=0;i<m;i++)
    25             scanf("%d",&b[i]);
    26         memset(num,0,sizeof(num));
    27         memset(have,0,sizeof(have));
    28         memset(t,0,sizeof(t));
    29         for(int i=0;i<n;i++)
    30             p[i]=i;
    31         int idx=0,count=0;
    32         for(int i=0;i<m;i++){
    33             if(have[i])continue;
    34             idx=i;
    35             count=0;
    36             while(!have[idx]){
    37                 have[idx]=true;
    38                 count++;
    39                 idx=b[idx];
    40             }
    41             v.push_back(count);
    42         }
    43         for(int i=0;i<n;i++){
    44             p[a[i]]=Find(i);
    45         }
    46         for(int i=0;i<n;i++){
    47             num[Find(i)]++;
    48         }
    49         for(int i=0;i<n;i++)
    50             if(num[i])t[num[i]]++;
    51         for(int i=0;i<=n;i++){
    52             while(t[i]--)k.push_back(i);
    53         }
    54         for(int i=0;i<k.size();i++){
    55             int ans0=0;
    56             for(int j=0;j<v.size();j++){
    57                 //int q=v[j],l=k[i];
    58                 if(k[i]%v[j]==0)
    59                     ans0=(ans0+v[j])%mod;
    60             }
    61             ans=((long long)ans*ans0)%mod;
    62         }
    63         printf("Case #%d: %d
    ",++kase,ans);
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    阿里PAI深度学习组件:Tensorflow实现图片智能分类实验
    IDEA with MaxCompute Stadio
    阿里云大数据产品解决方案ODPSADSSTERAMCOMPUTEPAI介绍
    Hive DDL ROW FORMAT
    Spark-Streaming和Kafka集成指南
    网站分析指标
    网站分析概要
    前端规范大总结
    不容错过的20段CSS代码
    利用CSS实现居中对齐
  • 原文地址:https://www.cnblogs.com/7391-KID/p/7236960.html
Copyright © 2011-2022 走看看