QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#856868#9962. Diminishing FractionsIllusionaryDominance#WA 188ms5964kbC++202.4kb2025-01-14 18:26:212025-01-14 18:26:21

Judging History

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

  • [2025-01-14 18:26:21]
  • 评测
  • 测评结果:WA
  • 用时:188ms
  • 内存:5964kb
  • [2025-01-14 18:26:21]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 50000 + 5;

int qry[MAX_N];
char mark[MAX_N];
int pri[MAX_N], num[MAX_N], K[MAX_N], prod[MAX_N], cur[MAX_N], inv[MAX_N], pc;
char np[MAX_N];
vector <pair <int, int>> ans[MAX_N];

int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    } else {
        int d = exgcd(b, a % b, y, x);
        y -= a / b * x;
        return d;
    }
}

int main() {
    int T;
    scanf("%d", &T);
    for (int i = 1; i <= T; i ++) {
        scanf("%d", qry + i);
        mark[qry[i]] = i;
    }
    int N = 50000;
    for (int i = 2; i <= N; i ++) {
        if (!np[i]) {
            pri[++ pc] = i;
            num[pc] = cur[pc] = i;
            while (1ll * num[pc] * i <= N) {
                num[pc] *= i;
            }
            prod[pc] = 1;
            for (int j = 1; j < pc; j ++) {
                prod[j] = 1ll * prod[j] * i % num[j];
                prod[pc] = 1ll * prod[pc] * cur[j] % num[pc];
            }
        }
        for (int j = 1; j <= pc && i * pri[j] <= N; j ++) {
            np[i * pri[j]] = 1;
            if (i % pri[j] == 0) break;
        }
        for (int j = 1; j <= pc; j ++) {
            if (1ll * pri[j] * cur[j] <= i) {
                cur[j] *= pri[j];
                for (int k = 1; k <= pc; k ++) {
                    if (k != j) prod[k] = 1ll * prod[k] * pri[j] % num[k];
                }
            }
        }
        if (mark[i]) {
            for (int j = 1; j <= pc; j ++) {
                // fprintf(stderr, "j = %d, p = %d, prod = %d\n", j, pri[j], prod[j]);
                int a = prod[j] % cur[j], b = cur[j], x, y;
                assert(exgcd(a, b, x, y) == 1);
                if (x < 0) x += b;
                ans[i].emplace_back(x, b);
            }
        }
    }
    for (int i = 1; i <= T; i ++) {
        if (qry[i] == 1) {
            printf("1/1\n");
            continue;
        }else if (qry[i] == 2) {
            printf("1/2\n");
            continue;
        }
        double sum = 0;
        bool flag = false;
        for (auto [a, b] : ans[qry[i]]) {
            sum += (double)a / b;
            if (flag) {
                putchar('+');
            }else {
                flag = true;
            }
            printf("%d/%d", a, b);
        }
        printf("-%d/1\n", (int)floor(sum));
    }
    
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 187ms
memory: 3840kb

input:

2
3
6

output:

1/2+2/3-1/1
3/4+2/3+3/5-2/1

result:

ok OK, t = 2

Test #2:

score: 0
Accepted
time: 187ms
memory: 5964kb

input:

1
1

output:

1/1

result:

ok OK, t = 1

Test #3:

score: 0
Accepted
time: 188ms
memory: 3968kb

input:

10
1
2
3
4
5
6
7
8
9
10

output:

1/1
1/2
1/2+2/3-1/1
3/4+1/3-1/1
3/4+2/3+3/5-2/1
3/4+2/3+3/5-2/1
1/4+2/3+4/5+2/7-2/1
1/8+1/3+2/5+1/7-1/1
3/8+1/9+4/5+5/7-2/1
3/8+1/9+4/5+5/7-2/1

result:

ok OK, t = 10

Test #4:

score: -100
Wrong Answer
time: 188ms
memory: 3968kb

input:

54
7
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
3
47
81

output:

1/4+2/3+4/5+2/7-2/1
15/16+5/9+3/5+2/7+9/11+4/13+12/17+15/19-5/1
1/2
1/2+2/3-1/1
3/4+1/3-1/1
3/4+2/3+3/5-2/1
3/4+2/3+3/5-2/1
1/4+2/3+4/5+2/7-2/1
1/8+1/3+2/5+1/7-1/1
3/8+1/9+4/5+5/7-2/1
3/8+1/9+4/5+5/7-2/1
1/8+5/9+4/5+3/7+1/11-2/1
1/8+5/9+4/5+3/7+1/11-2/1
5/8+8/9+3/5+4/7+6/11+10/13-4/1
5/8+8/9+3/5+4/7...

result:

wrong answer Sums do not match for modulus 8809877585262195773