QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#551574 | #9254. Random Variables | ucup-team3510# | WA | 605ms | 23672kb | C++20 | 3.4kb | 2024-09-07 17:23:31 | 2024-09-07 17:23:33 |
Judging History
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;
}
詳細信息
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'