2017 Multi-University Training Contest

来源:互联网 发布:excel密码破解软件 编辑:程序博客网 时间:2024/05/31 19:52

题目链接:Function
题意:更定0~n-1的置换a和0~m-1的置换b,定义了函数f(i),其定义域为[0,n-1],值域为[0,m-1]。请计算每个i从0到n-1满足这里写图片描述的不同函数f的数量。题目补充说明了当且仅当至少存在一个i对应两个函数的函数值不同时,称这是两个不同的函数。
解法:遍历下标0~n-1。当前下标为i时,计算i在置换a中的循环节长度l,显然,由定义,该节就决定了 bx = y, by = z, … bxx = x, 的这个循环节能有多长,经过发现l的所有约数的循环节长度都是可以的。
用tot[j]表示:长度为j的循环节的种数(注意:相同长度的循环节相互之间一定是不能重复的),所以第i位可以出现的数值的种类是:

ll mul = 0;            for(int j = 1; j <= cnt; j++){                if(cnt % j == 0){                    mul += (tot[j] * j) % MOD;                    mul %= MOD;                }            }

因为每一位都是相互独立的,所以结果应该是mul的累乘。

#include<cstdio>#include<cstring>#include<iostream>#include<map>#include<queue>#include<algorithm>#define MOD 1000000007typedef long long ll;using namespace std;const int maxn = 1e5 + 10;int cas = 0;int n,m;ll tot[maxn];bool in[maxn];int a[maxn];int b[maxn];void findcycle(int* b,int m){    for(int i = 0 ; i < m; i++){        if(!in[i]){            in[i] = true;            int ii = b[i],cnt = 1;            while(ii != i){                in[ii] = true;                ii = b[ii];                ++cnt;            }            tot[cnt]++;        }    }}void work(){    for(int i = 0; i < n; i++){        scanf("%d",&a[i]);    }    for(int i = 0; i < m; i++){        scanf("%d",&b[i]);    }    memset(tot,0,sizeof(tot));    memset(in,0,sizeof(in));    findcycle(b,m);    memset(in,0,sizeof(in));    ll ans = 1;    for(int i = 0; i < n; i++){        if(!in[i]){            in[i] = true;            int ii = a[i],cnt = 1;            while(ii != i){                in[ii] = true;                ii = a[ii];                ++cnt;            }            ll mul = 0;            for(int j = 1; j <= cnt; j++){                if(cnt % j == 0){                    mul += (tot[j] * j) % MOD;                    mul %= MOD;                }            }            ans *= mul;            ans %= MOD;        }    }    printf("Case #%d: %lld\n", ++cas, ans % MOD);}int main(){    while(~scanf("%d%d",&n,&m)){        work();    }    return 0;}
原创粉丝点击