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;}
阅读全文
0 0
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- #2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- #2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- Hibernate入门(3):属性映射 & 主键映射
- e的科学计数法
- Android EventLog
- doxygen生成PDF文档
- POJ 2299 Ultra-QuickSort (树状数组+离散化)
- 2017 Multi-University Training Contest
- Perl Win32::Gui 模块学习 (1)---- 主窗口的创建
- HDOJ HDU 1042 N!
- ASP.NET(C#) VS2010连接Oracle数据库
- Hibernate入门(4):集合映射&组件映射
- 一道题带你认识ACM竞赛
- APUE第七章学习笔记
- lintcode balanced binary tree 解题思路
- Java程序员的五个职业发展方向