geronimo
時間限制 1s 空間限制 512MB
3.1 題目描述
“Geronimo~”
時間還很多,讓我們慢慢來。
不如聽首開心的歌再看題?…… 算了,直接看題吧。
給定一個整數(shù) n,以及一個 n 階的排列 p 1 , p 2 , …, p n 。
我們定義重組過程如下:如果當(dāng)前的排列是 a 1 , a 2 , …, a n ,經(jīng)過一次重組,就會
變成 p a 1 , p a 2 , …, p a n 。
問一個排列至少要經(jīng)過多少次重組才會恢復(fù)成重組前的狀態(tài)。
由于答案可能很大,輸出其對一個給定的正整數(shù) q 取模的值即可。
3.2 輸入格式
第一行兩個正整數(shù) n, q。
第二行一共 n 個整數(shù),依次表示 p 1 , p 2 , …, p n 。
同一行相鄰的數(shù)間用一個空格隔開。
3.3 輸出格式
一行一個整數(shù),表示答案對 q 取模的值。
3.4 樣例輸入
7 1000000207
2651347
3.5 樣例輸出
4
3.6 數(shù)據(jù)規(guī)模和約定
對于全部的數(shù)據(jù),q ≤ 2 × 10 9
對于 10% 的數(shù)據(jù),q = 1
對于另外 20% 的數(shù)據(jù),n ≤ 9
6對于另外 40% 的數(shù)據(jù),n ≤ 10 3
對于剩下 30% 的數(shù)據(jù),n ≤ 5 × 10 5
【題解】
這道題就是找出每個點恢復(fù)初始狀態(tài)的步數(shù)(或者稱為找個環(huán)),再求出這些步數(shù)的最大公約數(shù)即可。
(然而我考試時打了個愚蠢的10分暴力)
但注意有幾點優(yōu)化:
1、一個環(huán)上所有點恢復(fù)初始狀態(tài)的步數(shù)相同(解決TLE問題)
2、求一群數(shù)的最大公約數(shù),可以一一找出每一對數(shù),求出兩個數(shù)的最大公約數(shù),再用后一個數(shù)除掉(用前一個數(shù)的話就是改掉當(dāng)前搜索的數(shù),會wa7個點),最后把剩下的數(shù)連乘即可。(另一種思路是線性篩打表出素數(shù),看每個數(shù)的質(zhì)因子)
3、恢復(fù)初始狀態(tài)的步數(shù)相同的點的步數(shù)可去重,這里我用的是map(和vis一樣)。
總結(jié)
- 上一篇: Ubuntu 14.04+cuda7.5
- 下一篇: 行业增长乏力,转型失败案例多,平安银行要