题意:给一个置换,求最小循环长度对p取模的结果

思路:一个置换可以写成若干循环的乘积,最小循环长度为每个循环长度的最小公倍数。求最小公倍数对p取模的结果可以对每个数因式分解,将最小公倍数表示成质数幂的乘积形式,然后用快速幂取模,而不能一边求LCM一边取模。

由于这题数据量太大,需要用到输入挂,原理是把文件里面的东西用fread一次性读到内存。

输入挂模板:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace IO {
const static int maxn = << ;
static char buf[maxn], *pbuf = buf, *End;
void init() {
int c = fread(buf, , maxn, stdin);
End = buf + c;
}
int &readint() {
static int ans;
ans = ;
while (pbuf != End && !isdigit(*pbuf)) pbuf ++;
while (pbuf != End && isdigit(*pbuf)) {
ans = ans * + *pbuf - '0';
pbuf ++;
}
return ans;
}
}

源程序:

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma comment(linker, "/STACK:10240000")
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define X first
#define Y second
#define pb push_back
#define mp make_pair
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define copy(a, b) memcpy(a, b, sizeof(a)) typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull; //#ifndef ONLINE_JUDGE
void RI(vector<int>&a,int n){a.resize(n);for(int i=;i<n;i++)scanf("%d",&a[i]);}
void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>
void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?:-;
while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>
void print(const T t){cout<<t<<endl;}template<typename F,typename...R>
void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>
void print(T*p, T*q){int d=p<q?:-;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}
//#endif
template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);} const double PI = acos(-1.0);
const int INF = 1e9 + ;
const double EPS = 1e-8; /* -------------------------------------------------------------------------------- */ const int maxn = 3e6 + ;
const unsigned int md = ; vector<int> prime;
vector<vector<pii> > R;
bool vis[maxn], flag[maxn];
int power[maxn], a[maxn]; void init() {
for (ll i = ; i < maxn; i ++) {
if (flag[i]) continue;
prime.pb(i);
for (ll j = i * i; j < maxn; j += i) {
flag[j] = true;
}
}
} void add(int x) {
vector<pii> buf;
for (int i = ; x > && i < prime.size(); i ++) {
int c = ;
while (x % prime[i] == ) {
c ++;
x /= prime[i];
}
if (c) buf.pb(mp(i, c));
}
R.pb(buf);
} unsigned int powermod(int a, int b, unsigned int md) {
if (b == ) return ;
ull buf = powermod(a, b >> , md);
buf = buf * buf % md;
if (b & ) buf = buf * a % md;
return buf;
} namespace IO {
const static int maxn = << ;
static char buf[maxn], *pbuf = buf, *End;
void init() {
int c = fread(buf, , maxn, stdin);
End = buf + c;
}
int &readint() {
static int ans;
static char ch;
ans = ;
while (pbuf != End && !isdigit(*pbuf)) pbuf ++;
while (pbuf != End && isdigit(*pbuf)) {
ans = ans * + *pbuf - '0';
pbuf ++;
}
return ans;
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGE
int T, n;
IO::init();
T = IO::readint();
init();
while (T --) {
n = IO::readint();
for (int i = ; i <= n; i ++) {
a[i] = IO::readint();
}
fillchar(vis, );
R.clear();
for (int i = ; i <= n; i ++) {
if (vis[i] || a[i] == i) continue;
int cnt = ;
for (int j = i; !vis[j]; j = a[j]) {
vis[j] = true;
cnt ++;
}
add(cnt);
}
fillchar(power, );
int maxpower = ;
for (int i = ; i < R.size(); i ++) {
for (int j = ; j < R[i].size(); j ++) {
umax(power[R[i][j].X], R[i][j].Y);
umax(maxpower, R[i][j].X);
}
}
unsigned int ans = ;
for (int i = ; i <= maxpower; i ++) {
ans = ((ull)ans * powermod(prime[i], power[i], md)) % md;
}
printf("%u\n", ans);
}
return ;
}

[hdu5392 Infoplane in Tina Town]置换的最小循环长度,最小公倍数取模,输入挂的更多相关文章

  1. hdu5392 Infoplane in Tina Town(LCM)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Infoplane in Tina Town Time Limit: 14000/ ...

  2. HDU 5392 Infoplane in Tina Town

    Infoplane in Tina Town Time Limit: 14000/7000 MS (Java/Others)    Memory Limit: 524288/524288 K (Jav ...

  3. hdu 5392 Infoplane in Tina Town(数学)

    Problem Description There is a big stone with smooth surface in Tina Town. When people go towards it ...

  4. hdoj 5392 Infoplane in Tina Town

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5392 #include<stdio.h> #include<cstring> ...

  5. HDU-5391 Zball in Tina Town

    (n-1)!/n 就是如果n为素数,就等于n-1else为0. 求素数表: Zball in Tina Town Time Limit: 3000/1500 MS (Java/Others) Memo ...

  6. (hdu)5391 Zball in Tina Town

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5391 Problem Description Tina Town is a friendl ...

  7. hdu5391 Zball in Tina Town(威尔逊定理)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Zball in Tina Town Time Limit: 3000/1500 ...

  8. hdu 5391 Zball in Tina Town(打表找规律)

    问题描述 Tina Town 是一个善良友好的地方,这里的每一个人都互相关心. Tina有一个球,它的名字叫zball.zball很神奇,它会每天变大.在第一天的时候,它会变大11倍.在第二天的时候, ...

  9. C#版 - HDUoj 5391 - Zball in Tina Town(素数) - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. HDUoj 5 ...

随机推荐

  1. java对象头信息和三种锁的性能对比

    java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...

  2. sysbench安装和使用

    sysbench是一款测试工具 主要包括以下几种方式的测试: 1.cpu性能 2.磁盘io性能 3.调度程式性能 4.内存分配及传输速度 5.POSIX线程性能 6.数据库性能(OLTP基准测试)现在 ...

  3. 详解 HashMap

    本篇博文的知识点,在我们的日常生活中,应用十分广阔.比如:每个学生,都有自己的对应的学号.每一个公民,都有自己的身份证号- - 相信看到这里,有的同学基本上已经猜到了这个类的主要用途.那么,话不多说, ...

  4. 3. css百度制作字体图片

    http://fontstore.baidu.com/static/editor/index.html?qq-pf-to=pcqq.group

  5. SK-learn实现k近邻算法【准确率随k值的变化】-------莺尾花种类预测

    代码详解: from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split fr ...

  6. Nmap详细用法

    探测主机存活 (1)-sP :进行ping扫描 (2) -sn: ping探测扫描主机, 不进行端口扫描 (3)-sA     发送ACK探测存活 端口扫描 (1) -sS :半开放扫描 (2) sT ...

  7. Linux安全实验缓冲区溢出

    缓冲区溢出实验: 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关 ...

  8. 任意文件下载(pikachu)

    任意文件下载漏洞 很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件. 但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他 ...

  9. Makefile 中引用多个 include 路径

    LIB=-L/usr/informix/lib/c++ INC=-I/usr/informix/incl/c++ -I/opt/informix/incl/public default: main m ...

  10. 使用3种协议搭建yum仓库

    制作本地yum仓库 开启服务一般要关闭防火墙,selinux之后再reboot ## 方案一:FTP协议------ftp://IP 下载vsftpd---启动vsftpd---ftp://10.0. ...