HDU 5399
2015-08-18 20:11
211 查看
题意:给你n个数字,m个函数。每个函数满足,f1(f2(⋯fm(i)))=i
然后有可能函数的不给你,就是写出来-1.
让你自己给-1那行赋值,问你有多少种可能。
只有一个-1的时候肯定是1。
但是没有-1的时候还要看给你的函数 满不满足条件。
-1有k个。1行的种是N!个。
最后一个-1可以被其他已经赋值的-1确定。最后结果是N !^(k-1).
f1(f2(⋯fm
(i)))=i
f
i
f
i
然后有可能函数的不给你,就是写出来-1.
让你自己给-1那行赋值,问你有多少种可能。
只有一个-1的时候肯定是1。
但是没有-1的时候还要看给你的函数 满不满足条件。
-1有k个。1行的种是N!个。
最后一个-1可以被其他已经赋值的-1确定。最后结果是N !^(k-1).
<span style="font-family: 'Times New Roman';">#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int mod=1e9+7; int num[101][111]; int dfs(int m,int x,int j) { //printf("%d %d %d\n",m,x,j); if(m==0) { if(x==j)return 1; return 0; } return dfs(m-1,num[m-1][x]-1,j); } int main() { int n,m,x,kj; long long sum=0; while(scanf("%d%d",&n,&m)!=EOF) { sum=1; kj=0; for(int i=0; i<m; i++) for(int j=0; j<n; j++) { scanf("%d",&num[i][j]); if(num[i][j]==-1) { kj++; break; } } bool flag=true; int f[1001]; for(int i=0; i<m; i++) { if(num[i][0]==-1) continue; memset(f,0,sizeof(f)); for(int j=0; j<n; j++) { f[num[i][j]]++; if(f[num[i][j]]>1) flag=false; } } if(kj==0) for(int i=0; i<n; i++) { int t1=dfs(m-1,num[m-1][i]-1,i); if(!t1) flag=false; //printf("t1=%d\n",t1); } // printf("%d\n",flag); if(flag==false) { puts("0"); continue; } if(kj<=1) { printf("1\n"); } else { long long s=1; for(int i=1; i<=n; i++) { s*=i; s%=mod; } for(int i=1; i<kj; i++) { sum*=s; sum%=mod; } printf("%lld\n",sum); } } return 0; } </span>
f1(f2(⋯fm
(i)))=i
f
i
f
i
相关文章推荐
- Codeforces Gym 100650C The Game of Efil DFS
- Vs2010 配置驱动的开发环境
- iOS视图控制器的跳转方法
- java和javascript双引号嵌套的问题
- 线段树的两种查询方式
- 分词器之NLPIR加密文件在哪
- 微信支付又下一城:可以缴税了
- android---复杂布局的学习
- 动态行转列小记
- Hibernate4与hibernate3有错误的版本号的主要区别所造成的不一致
- jQuery---EasyUI小案列
- Linux cheat命令
- 2.9 Fibonacci数列
- hdu 2669
- IBOutlet 以及 IBAction 意义
- 支付宝 iOS SDK 官方下载页面
- 强连通分量 模板
- 总线设备驱动模型——总线篇
- 字符串转换成整数
- 关于Android—Activity 生命周期图