QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#810653#6137. Sub-cycle GraphSktn0089AC ✓71ms10336kbC++142.1kb2024-12-12 08:01:322024-12-12 08:01:33

Judging History

你现在查看的是最新测评结果

  • [2024-12-12 08:01:33]
  • 评测
  • 测评结果:AC
  • 用时:71ms
  • 内存:10336kb
  • [2024-12-12 08:01:32]
  • 提交

answer

#include <bits/stdc++.h>

namespace Initial {
	#define ll long long
	#define ull unsigned long long
	#define fi first
	#define se second
	#define mkp make_pair
	#define pir pair <int, int>
	#define pb emplace_back
	#define i128 __int128
	using namespace std;
	const ll maxn = 2e5 + 10, inf = 1e9, mod = 1e9 + 7;
	ll power(ll a, ll b = mod - 2) {
		ll s = 1;
		while(b) {
			if(b & 1) s = 1ll * s * a %mod;
			a = 1ll * a * a %mod, b >>= 1;
		} return s;
	}
	template <class T>
	const inline ll pls(const T x, const T y) { return x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void add(T &x, const T y) { x = x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void chkmax(T &x, const T y) { x = x < y? y : x; }
	template <class T>
	const inline void chkmin(T &x, const T y) { x = x > y? y : x; }
} using namespace Initial;

namespace Read {
	char buf[1 << 22], *p1, *p2;
//	#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF : *p1++)
	template <class T>
	const inline void rd(T &x) {
		char ch; bool neg = 0;
		while(!isdigit(ch = getchar()))
			if(ch == '-') neg = 1;
		x = ch - '0';
		while(isdigit(ch = getchar()))
			x = (x << 1) + (x << 3) + ch - '0';
		if(neg) x = -x;
	}
} using Read::rd;

ll t, n, m, fac[maxn], ifac[maxn], N = 2e5, pw[maxn];

signed main() {
	rd(t), fac[0] = pw[0] = 1;
	for(ll i = 1; i <= N; i++)
		fac[i] = fac[i - 1] * i %mod, pw[i] = pw[i - 1] * (mod - mod / 2) %mod;
	ifac[N] = power(fac[N]);
	for(ll i = N; i; i--) ifac[i - 1] = ifac[i] * i %mod;
	while(t--) {
		rd(n), rd(m);
		if(m > n) puts("0");
		else if(m == n) printf("%lld\n", (mod - mod / 2) * fac[n - 1] %mod);
		else {
			ll ans = 0; m = n - m;
			for(ll i = 0; i <= m; i++) {
				ll now = n - m - i;
				if(!i) add(ans, (!now) * ifac[m]);
				else if(now >= 0)
					add(ans, ifac[i] * ifac[m - i] %mod * ifac[i - 1] %mod * ifac[now]
					 %mod * fac[i - 1 + now] %mod * pw[i] %mod);
			} printf("%lld\n", ans * fac[n] %mod);
		}
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 4ms
memory: 10336kb

input:

3
4 2
4 3
5 3

output:

15
12
90

result:

ok 3 number(s): "15 12 90"

Test #2:

score: 0
Accepted
time: 71ms
memory: 10172kb

input:

17446
3 0
3 1
3 2
3 3
4 0
4 1
4 2
4 3
4 4
5 0
5 1
5 2
5 3
5 4
5 5
6 0
6 1
6 2
6 3
6 4
6 5
6 6
7 0
7 1
7 2
7 3
7 4
7 5
7 6
7 7
8 0
8 1
8 2
8 3
8 4
8 5
8 6
8 7
8 8
9 0
9 1
9 2
9 3
9 4
9 5
9 6
9 7
9 8
9 9
10 0
10 1
10 2
10 3
10 4
10 5
10 6
10 7
10 8
10 9
10 10
11 0
11 1
11 2
11 3
11 4
11 5
11 6
11 7
11...

output:

1
3
3
1
1
6
15
12
3
1
10
45
90
60
12
1
15
105
375
630
360
60
1
21
210
1155
3465
5040
2520
360
1
28
378
2940
13545
35280
45360
20160
2520
1
36
630
6552
42525
170100
393120
453600
181440
20160
1
45
990
13230
114345
643545
2286900
4762800
4989600
1814400
181440
1
55
1485
24750
273735
2047815
10239075
3...

result:

ok 17446 numbers