Submission #33643608
Source Code Expand
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using mint = atcoder::modint1000000007;
typedef long long ll;
#define MOD 1000000007
#define rep(i,a,n) for (ll i=a;i<(ll)n;i++)
#define per(i,a,n) for (ll i=n;i-->(ll)a;)
#define pb push_back
ll read(){ll r;scanf("%lld",&r);return r;} // read
#define INF 0x3f3f3f3f
const int N = 3000;
int p[N+10];
int q[N+10];
int e[N+10]; // 单向边
int vis2[N+10]; // 每个环的结束位置 = 1, 例如环为 2 3 5, 那么 [2]=1,[2+3=5]=1,[5+5=10]=1, 自环结束位置=2
// 0 不分配, 1 分配左点, 2分配右点
mint g[N+10][N+10][3][3]; // [i][j][s0][si] 每个环剖成链以后,长度i的链 分配了j条, 当前环 首个点state 0, 最后一个点statei
mint fac[N+10];
int main() {
int n=read();
fac[0]=1;
rep(i,1,n+1) fac[i]=fac[i-1]*i;
rep(i,0,n) p[i] = read();
rep(i,0,n) e[p[i]] = q[i] = read(); // 建立边 p,q => e
{ // e => vis2
vector<bool> vis(n+1,false); // 点是否被访问
int m = 0;
rep(i,1,n+1) if(!vis[i]){
if(e[i]==i) { // 自环
vis2[++m]=2;
continue;
}
for(int j=i;!vis[j];j=e[j]) {
vis[j]=1;
m++;
}
vis2[m]=1;
}
}
g[0][0][0][0] = 1; // 初始状态
vis2[0] = 1; // 初始状态
rep(i,0,n+1) rep(j,0,i+1){ // 剖成链, 前i个边, 指定j个不合法, 第i个点所在环首个点s0,第i个点s1状态
if(vis2[i]) { // 环结束位置
g[i][j][1][2] = 0;
if(vis2[i]==2) g[i][j][1][1]=0; // 自环, 不选是一种, 选左和选右相同, 去掉一个
rep(k,0,3) rep(l,0,3) { // i+1 是新的环
auto v = g[i][j][k][l];
g[i+1][j ][0][0] += v; // 新环 本身与i 无关, 应该是1,这里相当于全部乘上前面的倍数
g[i+1][j+1][1][1] += v;
g[i+1][j+1][2][2] += v;
}
} else { // 环内
rep(k,0,3) rep(l,0,3){
auto v = g[i][j][k][l];
g[i+1][j ][k][0] += v;
g[i+1][j+1][k][1] += ((l == 2) ? 0 : v);
g[i+1][j+1][k][2] += v;
}
}
}
mint res = 0;
rep(i,0,n+1) {
mint cnt = 0; // 方案数
rep(j,0,3) rep(k,0,3) cnt += g[n][i][j][k];
res += fac[n-i]*cnt*(i%2?-1:1); // 容斥
}
printf("%d",res.val());
return 0;
}
Submission Info
Submission Time |
|
Task |
G - Three Permutations |
User |
cromarmot |
Language |
C++ (GCC 9.2.1) |
Score |
600 |
Code Size |
2259 Byte |
Status |
AC |
Exec Time |
288 ms |
Memory |
322408 KiB |
Compile Error
./Main.cpp: In function ‘ll read()’:
./Main.cpp:13:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
13 | ll read(){ll r;scanf("%lld",&r);return r;} // read
| ~~~~~^~~~~~~~~~~
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
600 / 600 |
Status |
|
|
Set Name |
Test Cases |
Sample |
example_00.txt, example_01.txt, example_02.txt |
All |
corner_00.txt, corner_01.txt, cycle_00.txt, cycle_01.txt, cycle_02.txt, cycle_03.txt, cycle_04.txt, cycle_05.txt, example_00.txt, example_01.txt, example_02.txt, rand_00.txt, rand_01.txt, rand_02.txt, rand_03.txt, rand_04.txt, rand_05.txt, rand_06.txt, rand_07.txt, rand_08.txt, rand_09.txt, rand_10.txt, rand_11.txt, rand_12.txt, rand_13.txt, rand_14.txt, rand_15.txt, rand_16.txt, rand_17.txt, rand_18.txt, rand_19.txt |
Case Name |
Status |
Exec Time |
Memory |
corner_00.txt |
AC |
203 ms |
322292 KiB |
corner_01.txt |
AC |
281 ms |
322408 KiB |
cycle_00.txt |
AC |
286 ms |
322348 KiB |
cycle_01.txt |
AC |
283 ms |
322320 KiB |
cycle_02.txt |
AC |
224 ms |
322228 KiB |
cycle_03.txt |
AC |
249 ms |
322164 KiB |
cycle_04.txt |
AC |
229 ms |
322220 KiB |
cycle_05.txt |
AC |
283 ms |
322220 KiB |
example_00.txt |
AC |
201 ms |
322364 KiB |
example_01.txt |
AC |
196 ms |
322136 KiB |
example_02.txt |
AC |
197 ms |
322136 KiB |
rand_00.txt |
AC |
288 ms |
322396 KiB |
rand_01.txt |
AC |
285 ms |
322220 KiB |
rand_02.txt |
AC |
284 ms |
322276 KiB |
rand_03.txt |
AC |
284 ms |
322356 KiB |
rand_04.txt |
AC |
269 ms |
322352 KiB |
rand_05.txt |
AC |
272 ms |
322324 KiB |
rand_06.txt |
AC |
222 ms |
322320 KiB |
rand_07.txt |
AC |
220 ms |
322300 KiB |
rand_08.txt |
AC |
199 ms |
322144 KiB |
rand_09.txt |
AC |
201 ms |
322144 KiB |
rand_10.txt |
AC |
219 ms |
322324 KiB |
rand_11.txt |
AC |
206 ms |
322284 KiB |
rand_12.txt |
AC |
199 ms |
322244 KiB |
rand_13.txt |
AC |
240 ms |
322224 KiB |
rand_14.txt |
AC |
213 ms |
322376 KiB |
rand_15.txt |
AC |
200 ms |
322360 KiB |
rand_16.txt |
AC |
208 ms |
322148 KiB |
rand_17.txt |
AC |
222 ms |
322232 KiB |
rand_18.txt |
AC |
219 ms |
322208 KiB |
rand_19.txt |
AC |
225 ms |
322316 KiB |