hdu 5392
2015-08-16 16:03
232 查看
[align=left]Sample Input[/align]
2
3
1 3 2
6
2 3 4 5 6 1
Sample Output
2
6
题意:给一个转置求它的循环长度
题解:分解成循环求最小公倍数
2
3
1 3 2
6
2 3 4 5 6 1
Sample Output
2
6
题意:给一个转置求它的循环长度
题解:分解成循环求最小公倍数
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; #define MOD 3221225473 #define N 100005 #define MIN 0 #define MAX 1000001 const int maxn = 3000005; int a[maxn],vis[maxn],sum[maxn]; void fin(int num) { int tt; for(int i = 2; i <= num; i++) { tt = 0; while(num%i == 0) { num/=i; tt++; } if(tt > sum[i]) sum[i] = tt; } } ll pow_mod(ll q,int n,ull mod) { if(n == 0) return 1; ll x = pow_mod(q,n/2,mod); ll ans = (ll)x*x%mod; if(n %2 == 1) ans = ans *q % mod; return ans; } int main() { int n,T; scanf("%d",&T); while(T--) { scanf("%d",&n); ll ans; for(int i = 1; i <= n; i++) scanf("%d",&a[i]); memset(vis,0,sizeof(vis)); memset(sum,0,sizeof(sum)); for(int i = 1; i <= n; i++) { if(vis[i]) continue; int tmp = i; int num = 0; while(!vis[tmp]) { vis[tmp] = 1; tmp = a[tmp]; num ++; } //printf("num:%d\n",num); fin(num); } ans = 1; for(int i = 2; i <= n; i++) if(sum[i]) { //printf("%d\n",sum[i]); ans = (ans * pow_mod(i,sum[i],(ll)MOD))%MOD; } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- hdu 5392
- 4.4 指向成员函数的指针
- 有关EaseIn,EaseOut,EaseInOut
- 安装grafana和grafana-zabbix插件
- select函数总结
- SVN系列学习(一)-SVN的安装与配置
- select函数总结
- LeetCode:Median of Two Sorted Arrays
- HDU 5360 Hiking 优先队列
- 阅读优秀源代码
- Jedis连接池的使用
- 回调函数的原理及PHP实例
- Swift字典的使用
- POJ--2406Power Strings+KMP求字符串最小周期
- 拍卖倒计时
- HDU 5380 Travel with candy (单调队列&贪心)
- 学习驱动开发,这几个论坛值得经常看看
- Http协议
- 【机房收费系统】组合查询
- const的用法