結果
問題 | No.2045 Two Reflections |
ユーザー | kotatsugame |
提出日時 | 2022-08-19 22:23:16 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 7 ms / 2,000 ms |
コード長 | 938 bytes |
コンパイル時間 | 639 ms |
コンパイル使用メモリ | 68,944 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-10-08 09:17:45 |
合計ジャッジ時間 | 1,636 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#include<iostream> #include<cassert> #include<atcoder/modint> using namespace std; using mint=atcoder::modint998244353; int N,P,Q; int to[2<<17]; bool vis[2<<17]; int isp[2<<17]; int mx[2<<17]; int main() { cin>>N>>P>>Q; if(P==1&&Q==1) { cout<<1<<endl; return 0; } if(P==1||Q==1) { cout<<2<<endl; return 0; } if(P+Q<=N) { cout<<4<<endl; return 0; } for(int i=0;i<N;i++) { {//P if(i<P)to[i]=N+(P-i-1); else to[i]=N+i; } {//Q if(N-Q<=i)to[N+i]=N-1-(i-(N-Q)); else to[N+i]=i; } } for(int p=2;p<=2*N;p++)if(isp[p]==0) { mx[p]=1; for(int i=p;i<=2*N;i+=p)isp[i]=p; } for(int i=0;i<N;i++)if(!vis[i]) { int u=i; int c=0; while(!vis[u]) { c++; vis[u]=true; u=to[u]; } assert(u<N); while(c>1) { int p=isp[c]; int q=1; while(c%p==0)c/=p,q*=p; mx[p]=max(mx[p],q); } } mint ans=1; for(int p=2;p<=2*N;p++)if(isp[p]==p)ans*=mx[p]; cout<<ans.val()<<endl; }