結果
| 問題 |
No.2133 Take it easy!
|
| コンテスト | |
| ユーザー |
chro_96
|
| 提出日時 | 2022-11-28 20:00:31 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 16 ms / 2,000 ms |
| コード長 | 2,580 bytes |
| コンパイル時間 | 1,017 ms |
| コンパイル使用メモリ | 31,488 KB |
| 実行使用メモリ | 7,768 KB |
| 最終ジャッジ日時 | 2024-10-05 20:04:01 |
| 合計ジャッジ時間 | 1,834 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#include <stdio.h>
#include <stdlib.h>
int cmp_ll (const void *ap, const void *bp) {
long long a = *(long long *)ap;
long long b = *(long long *)bp;
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}
long long power_mod (long long a, long long b, long long mod_num) {
long long ans = 1LL;
if (b > 0LL) {
ans = power_mod(a, b/2LL, mod_num);
ans = (ans * ans) % mod_num;
if (b%2LL == 1LL) {
ans = (ans * a) % mod_num;
}
}
return ans;
}
int main () {
int n = 0;
int q = 0;
int l = 0;
int r = 0;
int res = 0;
long long ans = 1LL;
long long mod_num = 998244353LL;
long long s[200001] = {};
int cnt = 0;
int is_ok = 1;
long long fact[200002] = {};
long long invf[200002] = {};
res = scanf("%d", &n);
res = scanf("%d", &q);
for (int i = 0; i < q; i++) {
res = scanf("%d", &l);
res = scanf("%d", &r);
s[l-1] |= (1LL<<((long long)i));
s[r] |= (1LL<<((long long)i));
}
fact[0] = 1LL;
for (int i = 0; i <= n; i++) {
fact[i+1] = fact[i];
fact[i+1] *= (long long) (i+1);
fact[i+1] %= mod_num;
}
invf[n+1] = power_mod(fact[n+1], mod_num-2LL, mod_num);
for (int i = n+1; i > 0; i--) {
invf[i-1] = invf[i];
invf[i-1] *= (long long) i;
invf[i-1] %= mod_num;
}
for (int i = 1; i < n; i++) {
s[i] = (s[i]^s[i-1]);
}
qsort(s, n, sizeof(long long), cmp_ll);
cnt = 1;
s[n] = -1LL;
for (int i = 1; i <= n; i++) {
if (s[i] != s[i-1]) {
if (s[i-1] != 0LL && cnt%2 == 1) {
is_ok = 0;
} else if (cnt%2 == 1) {
long long tmp1 = fact[cnt+1];
long long tmp2 = fact[cnt+1];
tmp1 *= invf[(cnt+1)/2];
tmp1 %= mod_num;
tmp1 *= invf[(cnt+1)/2];
tmp1 %= mod_num;
tmp2 *= invf[(cnt+3)/2];
tmp2 %= mod_num;
tmp2 *= invf[(cnt-1)/2];
tmp2 %= mod_num;
ans *= tmp1+mod_num-tmp2;
ans %= mod_num;
} else {
long long tmp1 = fact[cnt];
long long tmp2 = fact[cnt];
tmp1 *= invf[cnt/2];
tmp1 %= mod_num;
tmp1 *= invf[cnt/2];
tmp1 %= mod_num;
tmp2 *= invf[1+cnt/2];
tmp2 %= mod_num;
tmp2 *= invf[cnt/2-1];
tmp2 %= mod_num;
ans *= tmp1+mod_num-tmp2;
ans %= mod_num;
}
cnt = 0;
}
cnt++;
}
if (is_ok <= 0) {
printf("0\n");
return 0;
}
ans *= fact[n/2];
ans %= mod_num;
ans *= fact[n-n/2];
ans %= mod_num;
printf("%lld\n", ans);
return 0;
}
chro_96