QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#551574#9254. Random Variablesucup-team3510#WA 605ms23672kbC++203.4kb2024-09-07 17:23:312024-09-07 17:23:33

Judging History

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

  • [2024-09-07 17:23:33]
  • 评测
  • 测评结果:WA
  • 用时:605ms
  • 内存:23672kb
  • [2024-09-07 17:23:31]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int N = 1005, S = 32;
int f[N][N], g[N][N], A[N][N], B[N][N], fac[N], inv[N], iv[N], mod;
int C[N][N];
int pw[N];
int qpow(int x, int y)
{
	int ans = 1;
	while(y)
	{
		if(y & 1)
			ans = (ll)ans * x % mod;
		x = (ll)x * x % mod;
		y >>= 1;
	}
	return ans;
}
int exgcd(int &x, int &y, int a, int b)
{
	if(!a)
	{
		x = 0;
		y = 1;
		return b;
	}
	int g = exgcd(y, x, b % a, a);
	x -= (b / a) * y;
	return g;
}
void prep(int n)
{
	int i, j, k, l;
	// fac[0] = 1;
	// for(i = 1; i <= n; i++)
	// 	fac[i] = (ll)fac[i - 1] * i % mod;
	// inv[n] = qpow(fac[n], mod - 2);
	// for(i = n; i >= 1; i--)
	// 	inv[i - 1] = (ll)inv[i] * i % mod;
	// for(i = 1; i <= n; i++)
	// 	iv[i] = (ll)inv[i] * fac[i - 1] % mod;
	for(i = 0; i <= n; i++)
	{
		C[i][0] = 1;
		for(j = 1; j <= i; j++)
			C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
	}
	for(i = 1; i <= S; i++)
	{
		f[0][0] = 1;
		for(j = 1; j <= n; j++)
			for(k = 0; k < n; k++)
				f[j][k + 1] = (f[j][k] + f[j - 1][k] + (k < i ? 0ll : (ll)(mod - C[k][i]) * f[j - 1][k - i])) % mod * j % mod;
		// if(i == 2)
		// 	printf("??%d\n", f[2][3]);
		for(j = 0; j <= n; j++)
			for(k = 0; k <= n; k++)
				A[k][j] = (A[k][j] + (ll)((i == S) ? S : mod - 1) * f[j][k]) % mod;
		if(i == S)
			for(j = 0; j <= n; j++)
				for(k = 0; k <= n; k++)
					B[k][j] = f[j][k];
	}
	// for(j = 0; j <= n; j++)
	// 	for(k = 0; k <= n; k++)
	// 	{
	// 		A[j][k] = (ll)A[j][k] * inv[k] % mod;
	// 		B[j][k] = (ll)B[j][k] * inv[k] % mod;
	// 	}
	memset(f, 0, sizeof(f));
	for(i = n; i > S; i--)
	{
		for(j = 0; j <= n; j++)
			for(k = 0; k <= j / i; k++)
				g[j][k] = 0;
		pw[0] = 1;
		for(j = 1; j <= n / i; j++)
			pw[j] = (ll)pw[j - 1] * C[j * i][i] % mod;
		f[0][0] = i;
		for(j = 0; j <= n; j++)
			for(k = 0; k <= j / i; k++)
				for(l = 0; l <= (n - j) / i; l++)
					g[j + l * i][k + l] = (g[j + l * i][k + l] + (ll)f[j][k] * pw[l] % mod * C[j + l * i][j] % mod * C[k + l][k]) % mod;
		g[0][0] = 0;
		for(j = 0; j <= n; j++)
			for(k = 0; k <= j / i; k++)
				f[j][k] = g[j][k];
	}
}
int pr[105], pp[105], ct[105], cnt;
void work(int m)
{
	int i;
	for(i = 2; i * i <= m; i++)
		if(!(m % i))
		{
			++cnt;
			pr[cnt] = i;
			while(!(m % i))
			{
				m /= i;
				pp[cnt]++;
			}
		}
	if(m > 1)
	{
		++cnt;
		pr[cnt] = m;
		pp[cnt] = 1;
	}
}
int qwq(int x, int y)
{
	int i;
	for(i = 1; i <= cnt; i++)
		while(!(x % pr[i]))
		{
			ct[i] += y;
			x /= pr[i];
		}
	return x;
}

int main()
{
	int i, j, k, T, n, m, ans, v, x, y;
	scanf("%d%d", &T, &mod);
	prep(1000);
	work(mod);
	while(T--)
	{
		scanf("%d%d", &n, &m);
		memset(pw, 0, sizeof(pw));
		pw[0] = v = 1;
		ans = 0;
		for(j = 1; j <= cnt; j++)
			ct[j] = 0;
		for(i = 0; i < min(n, m); i++)
		{
			v = (ll)v * qwq(m - i, 1) % mod;
			exgcd(x, y, qwq(i + 1, -1), mod);
			v = (ll)(x + mod) * v % mod;
			pw[i + 1] = v;
			for(j = 1; j <= cnt; j++)
				for(k = 1; k <= min(pp[j], ct[j]); k++)
					pw[i + 1] = (ll)pw[i + 1] * pr[j] % mod;
		}
		for(i = 0; i <= n; i++)
		{
			// printf("!%d %d\n", i, pw[i]);
			ans = (ans + (ll)A[n][i] * pw[i]) % mod;
			// printf("??%d %d\n", i, A[n][i]);
			for(j = 0; j <= i; j++)
				for(k = 0; k <= (n - i) / S; k++)
					ans = (ans + (ll)B[i][j] * f[n - i][k] % mod * C[j + k][j] % mod * C[n][i] % mod * pw[j + k]) % mod;
		}
		printf("%d\n", ans);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 605ms
memory: 23608kb

input:

3 123456789
3 2
5 5
7 7

output:

18
7145
2066323

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 587ms
memory: 23612kb

input:

100 2
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 10
4 1
4 2
4 3
4 4
4 5
4 6
4 7
4 8
4 9
4 10
5 1
5 2
5 3
5 4
5 5
5 6
5 7
5 8
5 9
5 10
6 1
6 2
6 3
6 4
6 5
6 6
6 7
6 8
6 9
6 10
7 1
7 2
7 3
7 4
7 5
7 6
7 7
7 8
7 9
7 10
8 1
8 2...

output:

1
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0

result:

ok 100 lines

Test #3:

score: 0
Accepted
time: 602ms
memory: 23636kb

input:

100 3
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 10
4 1
4 2
4 3
4 4
4 5
4 6
4 7
4 8
4 9
4 10
5 1
5 2
5 3
5 4
5 5
5 6
5 7
5 8
5 9
5 10
6 1
6 2
6 3
6 4
6 5
6 6
6 7
6 8
6 9
6 10
7 1
7 2
7 3
7 4
7 5
7 6
7 7
7 8
7 9
7 10
8 1
8 2...

output:

1
2
0
1
2
0
1
2
0
1
2
0
0
2
0
0
2
0
0
2
0
0
0
0
0
0
0
0
0
0
1
2
0
1
2
0
1
2
0
1
2
2
0
2
2
0
2
2
0
2
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
1
2
2
0
2
2
0
2
2
0
2
0
0
0
0
0
0
0
0
0
0
1
2
0
1
2
0
1
2
0
1

result:

ok 100 lines

Test #4:

score: 0
Accepted
time: 587ms
memory: 23672kb

input:

100 4
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 10
4 1
4 2
4 3
4 4
4 5
4 6
4 7
4 8
4 9
4 10
5 1
5 2
5 3
5 4
5 5
5 6
5 7
5 8
5 9
5 10
6 1
6 2
6 3
6 4
6 5
6 6
6 7
6 8
6 9
6 10
7 1
7 2
7 3
7 4
7 5
7 6
7 7
7 8
7 9
7 10
8 1
8 2...

output:

1
2
3
0
1
2
3
0
1
2
2
2
0
0
2
2
0
0
2
2
3
2
3
0
3
2
3
0
3
2
0
0
0
0
0
0
0
0
0
0
1
2
3
0
1
2
3
0
1
2
2
0
2
0
2
0
2
0
2
0
3
0
3
0
3
0
3
0
3
0
0
0
0
0
0
0
0
0
0
0
1
2
3
0
1
2
3
0
1
2
2
0
2
0
2
0
2
0
2
0

result:

ok 100 lines

Test #5:

score: 0
Accepted
time: 597ms
memory: 23540kb

input:

100 5
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 10
4 1
4 2
4 3
4 4
4 5
4 6
4 7
4 8
4 9
4 10
5 1
5 2
5 3
5 4
5 5
5 6
5 7
5 8
5 9
5 10
6 1
6 2
6 3
6 4
6 5
6 6
6 7
6 8
6 9
6 10
7 1
7 2
7 3
7 4
7 5
7 6
7 7
7 8
7 9
7 10
8 1
8 2...

output:

1
2
3
4
0
1
2
3
4
0
2
1
2
0
0
2
1
2
0
0
3
3
1
3
0
3
3
1
3
0
4
4
2
4
0
4
4
2
4
0
0
0
0
0
0
0
0
0
0
0
1
2
3
4
0
1
2
3
4
0
2
3
3
2
0
2
3
3
2
0
3
4
1
2
0
3
4
1
2
0
4
4
4
4
0
4
4
4
4
0
0
0
0
0
0
0
0
0
0
0

result:

ok 100 lines

Test #6:

score: -100
Wrong Answer
time: 601ms
memory: 23604kb

input:

100 6
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 10
4 1
4 2
4 3
4 4
4 5
4 6
4 7
4 8
4 9
4 10
5 1
5 2
5 3
5 4
5 5
5 6
5 7
5 8
5 9
5 10
6 1
6 2
6 3
6 4
6 5
6 6
6 7
6 8
6 9
6 10
7 1
7 2
7 3
7 4
7 5
7 6
7 7
7 8
7 9
7 10
8 1
8 2...

output:

1
2
3
2
5
0
1
2
3
4
2
0
0
4
0
0
2
2
0
2
3
0
3
0
3
0
3
0
3
0
4
2
0
2
2
0
4
2
0
4
5
2
3
4
5
0
5
0
3
2
0
0
0
0
0
0
0
0
0
0
1
0
3
2
3
0
1
4
3
4
2
2
0
4
2
0
2
0
0
2
3
0
3
0
3
0
3
0
3
0
4
2
0
2
2
0
4
2
0
4

result:

wrong answer 4th lines differ - expected: '4', found: '2'