QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#662644#9254. Random VariablesKiharaToumaWA 3ms12824kbC++141.9kb2024-10-21 08:21:452024-10-21 08:21:45

Judging History

This is the latest submission verdict.

  • [2024-10-21 08:21:45]
  • Judged
  • Verdict: WA
  • Time: 3ms
  • Memory: 12824kb
  • [2024-10-21 08:21:45]
  • Submitted

answer

//qoj9254
#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
typedef long long ll;
int T, n;
ll m, P, f[N][N], C[N][N], ans;

struct Mod{
    ll m, p;
    void init(int pp){
        m = ((__int128)1 << 64) / pp;
        p = pp;
    }
    ll operator ()(ll x){
        if(p == 2){
            return x & 1;
        }
        return x - ((__int128(x) * m) >> 64) * p;
    }
} mod;

ll qp(ll x, ll y){
    ll ans = 1;
    while(y){
        if(y & 1){
            ans = mod(ans * x);
        }
        x = mod(x * x);
        y >>= 1;
    }
    return ans;
}

int main(){
    scanf("%d%lld", &T, &P);
    n = 1000;
    mod.init(P);
    C[0][0] = 1;
    for(int i = 1; i <= n; ++ i){
        C[i][0] = 1;
        for(int j = 1; j <= i; ++ j){
            C[i][j] = C[i-1][j] + C[i-1][j-1];
            if(C[i][j] >= P){
                C[i][j] -= P;
            }
        }
    }
    while(T--){
        ans = 0;
        scanf("%d%lld", &n, &m);
        for(int k = 0; k < n; ++ k){
            f[0][0] = 1;
            for(int i = 1; i <= n; ++ i){
                f[i][i/(k+1)+1] = 0;
                for(int j = 0; j * (k + 1) <= i; ++ j){
                    f[i][j] = mod(f[i-1][j] * (m - j));
                    if(i >= k + 1 && j){
                        ll tmp = mod(f[i-k-1][j-1] * (m - j + 1));
                        tmp = mod(tmp * C[n-(i-k)][k]);
                        f[i][j] -= tmp;
                        if(f[i][j] < 0){
                            f[i][j] += P;
                        }
                    }
                }
            }
            for(int j = 0; j * (k + 1) <= n; ++ j){
                ans += f[n][j];
                f[n][j] = 0;
                if(ans >= P){
                    ans -= P;
                }
            }
        }
        printf("%lld\n", mod(- ans + P + n * qp(m, n)));
    }
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 3ms
memory: 12488kb

input:

3 123456789
3 2
5 5
7 7

output:

18
7145
2066323

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 2ms
memory: 12624kb

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: -100
Wrong Answer
time: 0ms
memory: 12824kb

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
3
1
2
3
1
2
3
1
2
3
3
2
3
3
2
3
3
2
3
3
3
3
3
3
3
3
3
3
1
2
3
1
2
3
1
2
3
1
2
2
3
2
2
3
2
2
3
2
3
3
3
3
3
3
3
3
3
3
1
3
3
1
3
3
1
3
3
1
2
2
3
2
2
3
2
2
3
2
3
3
3
3
3
3
3
3
3
3
1
2
3
1
2
3
1
2
3
1

result:

wrong answer 3rd lines differ - expected: '0', found: '3'