日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

DTOJ3026 geronimo

發(fā)布時(shí)間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DTOJ3026 geronimo 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

DTOJ3026 geronimo

  • 題目
    • 題目描述
    • 輸入格式
    • 輸出格式
    • 樣例
      • 樣例輸入
      • 樣例輸出
    • 數(shù)據(jù)范圍與提示
  • 題解

題目

題目描述

“Geronimo~”
時(shí)間還很多,讓我們慢慢來。
不如聽首開心的歌再看題?…算了,直接看題吧
給定一個(gè)整數(shù)nnn,以及一個(gè)nnn階的排列p1,p2,...,pnp_1,p_2,...,p_np1?,p2?,...,pn?
我們定義重組過程如下:如果當(dāng)前的排列是a1,a2,...,ana_1,a_2,...,a_na1?,a2?,...,an?,經(jīng)過一次重組,就會(huì)變成pa1,pa2,...,panp_{a_1},p_{a_2},...,p_{a_n}pa1??,pa2??,...,pan??
問一個(gè)排列至少要經(jīng)過多少次重組才會(huì)恢復(fù)成重組前的狀態(tài)
由于答案可能很大,輸出其對(duì)一個(gè)給定的正整數(shù)qqq取模的值即可

輸入格式

第一行兩個(gè)正整數(shù)n,qn,qn,q
第二行一共nnn個(gè)整數(shù),依次表示p1,p2,...,pnp_1,p_2,...,p_np1?,p2?,...,pn?
同一行相鄰的數(shù)間用一個(gè)空格隔開

輸出格式

一行一個(gè)整數(shù),表示答案對(duì)qqq取模的值

樣例

樣例輸入

7 1000000207 2 6 5 1 3 4 7

樣例輸出

4

數(shù)據(jù)范圍與提示

對(duì)于全部的數(shù)據(jù),q?2×109q\leqslant 2\times 10^9q?2×109
對(duì)于10%10\%10%的數(shù)據(jù),q=1q=1q=1
對(duì)于另外20%20\%20%的數(shù)據(jù),n?9n\leqslant 9n?9
對(duì)于另外40%40\%40%的數(shù)據(jù),n?103n\leqslant 10^3n?103
對(duì)于剩下30%30\%30%的數(shù)據(jù),n?5×105n\leqslant 5\times 10^5n?5×105

題解

先求出每一個(gè)點(diǎn)要循環(huán)幾次才能回到原位,然后直接去一個(gè)LCM就好了
不能用傳統(tǒng)的GCD,因?yàn)樾枰∧?#xff01;必須用唯一分解定理
附上代碼:

#include<algorithm> #include<cstdio> using namespace std; int n,MOD,s,maxs,a[500010],f[500010],sum[500010],p[500010],v[500010]; long long ans=1,P[500010]; int main() {scanf("%d%d",&n,&MOD);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1,x;i<=n;i++){if(f[i]) continue;x=i;for(int j=1;;j++){if(sum[x]) break;if(!f[x]) f[x]=j;else sum[x]=j-f[x];x=a[x];}}for(int i=1;i<=n;i++) maxs=max(maxs,sum[i]);for(int i=2;i<=maxs;i++){if(v[i]) continue;p[++s]=i,P[s]=1;for(int j=i;j<=maxs;j+=i) v[j]=1;}sort(sum+1,sum+1+n);for(int i=1;i<=n;i++){if(sum[i]==sum[i-1]) continue;for(int j=1;j<=s;j++){long long ppa=1,Sum=sum[i];while(Sum%p[j]==0) Sum/=p[j],ppa=ppa*p[j]%MOD;P[j]=max(P[j],ppa);}}for(int i=1;i<=s;i++) ans*=P[i],ans%=MOD;printf("%lld",ans); }

總結(jié)

以上是生活随笔為你收集整理的DTOJ3026 geronimo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。