結果
| 問題 |
No.590 Replacement
|
| コンテスト | |
| ユーザー |
ixmel
|
| 提出日時 | 2017-04-21 16:29:14 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,566 bytes |
| コンパイル時間 | 1,239 ms |
| コンパイル使用メモリ | 107,368 KB |
| 実行使用メモリ | 22,756 KB |
| 最終ジャッジ日時 | 2024-07-20 05:04:54 |
| 合計ジャッジ時間 | 5,335 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 45 WA * 2 |
ソースコード
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdio>
#include<sstream>
#include<iomanip>
#include<assert.h>
#define loop(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mt make_tuple
#define all(in) in.begin(),in.end()
#define shosu(x) fixed<<setprecision(x)
using namespace std;
//kaewasuretyuui
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef vector<string> vs;
typedef vector<double> vd;
typedef tuple<ll,ll,ll> tp;
typedef vector<tp> vt;
typedef vector<vd> vvd;
typedef pair<int,pii> pip;
typedef vector<pip>vip;
const double PI=acos(-1);
const double EPS=1e-7;
const int inf=1e8;
const ll INF=1e16;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
ll gcd(ll a,ll b){
return (b==0?a:gcd(b,a%b));
}
ll lcm(ll a,ll b){
return a/gcd(a,b)*b;
}
ll n,size,co;
vvi in,info,siz;
vi used;
void f(int a,int b){
if(used[a])return;
used[a]=true;
info[b*2][a]=co;
info[b*2+1][a]=size++;
f(in[b][a],b);
}
int main(){
cin>>n;
assert(1<=n&&n<=100000);
in=vvi(2,vi(n));//a,b
info=vvi(4,vi(n));//numa,in_numa,numb,in_numb
siz=vvi(2);//num_loop
rep(i,2)rep(j,n)cin>>in[i][j];
rep(i,2)rep(j,n)assert(1<=in[i][j]&&in[i][j]<=n);
rep(i,2)rep(j,n)in[i][j]--;
rep(i,2){
vi asr(n);
rep(j,n){
if(asr[in[i][j]])assert(0);
asr[in[i][j]]=1;
}
}
rep(i,2){
used=vi(n);
size=0,co=0;//loop_size,num_loop
rep(j,n)if(used[j]==0){
size=0;
f(j,i);
siz[i].pb(size);
co++;
}
}
map<tp,vi>ma;
rep(i,n){
ll gc_d=gcd(siz[0][info[0][i]],siz[1][info[2][i]]);
ll t=(info[1][i]%gc_d-info[3][i]%gc_d+gc_d)%gc_d;
ma[mt(info[0][i],info[2][i],t)].pb(i);
}
ll out=0,MOD=1000000007,divby2=500000004;//divby2=埋め込み
for(auto it=ma.begin();it!=ma.end();it++){
ll loop_a,loop_b,gomi;
vi node=it->second;
tie(loop_a,loop_b,gomi)=it->first;
ll siz_a=siz[0][loop_a],siz_b=siz[1][loop_b];
ll gc_d=gcd(siz_a,siz_b);
vi point(siz_a/gc_d);
ll now=0;
rep(i,siz_a/gc_d){
point[now]=i;
(now+=siz_b/gc_d)%=siz_a/gc_d;
}
vi co(node.size());
rep(i,node.size()){
ll a=info[1][node[i]],b=info[3][node[i]];
ll t=(a-b+(ll)1e6*siz_a)%siz_a;
co[i]=point[t/gc_d]*siz_b+b;
}
sort(all(co));
co.pb(lcm(siz_a,siz_b)+co[0]);
rep(i,co.size()-1){
ll sa=co[i+1]-co[i]-1;
(out+=sa*(sa+1)%MOD*divby2%MOD)%=MOD;
}
}
cout<<out<<endl;
}
ixmel