hdu 6038 Function
来源:互联网 发布:简单软件编程教程 编辑:程序博客网 时间:2024/05/21 16:22
题目链接
题目大意:
序列a、b是由整数构成的一个排列,a由[0,n-1]构成,b由[0,m-1]构成,问:满足关系 f[i]=b[f(a[i])]的函数f有多少对。
官方题解
思路:
写写题例,发现f(i)的值域存在环,若值域存在环,题目又要求一一映射,则必须定义域也存在环(由题意所说的不同可知,每种情况下,映射可变,但仍然是一一对应),即a、b中皆存在环,且a中的环,可由b中环构成,那么b中对应的环的长度是a中相应环的长度的因子。
应该可以参考置换里常见的项链染色问题,假设a中的项链x,由三颗不同的珠子构成,b中有两个由单珠(彼此不同)构成的项链,一个由三颗不同珠子构成的项链。
那么构成方案有:1(长度)*2(该种项链数目)+3*1=5 种。根据乘法原理,若a中项链有多个,总方案数为a中每个项链构成方案数之积。
实现过程:
将a、b分别分解循环节,并且记录各个长度的循环节数目。最后统计方案,用到了根号法。
ac代码:
#include<stdio.h>#include<string.h>#define modd 1000000007int a[100005],b[100005];int vis[100005];int cala[100005],calb[100005];int main(){ int n,m,cas=0; while(~scanf( "%d%d", &n,&m)) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=0;i<m;i++) { scanf("%d",&b[i]); } //分解a环 memset(vis,0,sizeof(vis)); memset(cala,0,sizeof(cala)); int maxa=-1; for(int i=0;i<n;i++) { int j=0; if(!vis[i]) { int tmp=i; do { vis[tmp]=1; j++; tmp=a[tmp]; }while(tmp!=i); cala[j]++; maxa=j>maxa?j:maxa; } } //分解b环 memset(vis,0,sizeof(vis)); memset(calb,0,sizeof(calb)); int maxb=-1; for(int i=0;i<m;i++) { int j=0; if(!vis[i]) { int tmp=i; do { vis[tmp]=1; j++; tmp=b[tmp]; }while(tmp!=i); calb[j]++; } } int temp,ans=1,sum; for(int i=1;i<=maxa;i++) { if(cala[i])//若存在该长度的循环节,统计构成方案 { sum=0; for(int z=1;z*z<=i;z++)//根号法 { if(i%z==0)//找到“因子” { sum=(sum+(z*calb[z])%modd)%modd;//为防溢出,由相关性质,可以多次取模 if(z*z!=i) // sum=(sum+(calb[i/z]*(i/z))%modd)%modd; } } for(int j=1; j<=cala[i]; j++) ans=(ans*sum)%modd; } } printf("Case #%d: %d\n",++cas,ans%modd); } return 0;}
总结:
题目暗示了我们是置换。
阅读全文
0 0
- HDU 6038 Function
- HDU-6038 Function
- hdu 6038 Function(思维)
- HDU 6038 Function
- hdu 6038 Function
- HDU 6038 Function
- hdu 6038 Function
- HDU 6038 Function
- Function (HDU 6038)
- HDU 6038 Function【思维】
- hdu--6038--Function
- HDU 6038-Function
- hdu 6038 Function
- hdu 6038 Function
- Function HDU-6038
- HDU-6038 Function(思维)
- HDU 6038 Function (数学)
- HDU 6038 Function 置换群
- PAT 1065单身狗
- VB总结
- 安装固态后,关于4k对其
- BZOJ2190 洛谷2158 [SDOI2008 仪仗队]
- JDBC
- hdu 6038 Function
- C#(SuperWebSocket)与websocket通信
- let和const浅析
- 说Win清理不直观 有这个一目了然的走起不?
- HDU 6041(仙人掌图+tarjan)
- 博弈论(二):Sprague-Grundy函数
- 网页刷不开,那是你没改这个设置
- 敢动我电脑?小本本记下来
- 让windows10通知中心常驻