QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#544927#6512. Completely Multiplicative FunctionpropaneRE 48ms12608kbC++203.8kb2024-09-02 21:04:292024-09-02 21:04:30

Judging History

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

  • [2024-09-02 21:04:30]
  • 评测
  • 测评结果:RE
  • 用时:48ms
  • 内存:12608kb
  • [2024-09-02 21:04:29]
  • 提交

answer

#include<iostream>
#include<cstring>
#include<vector>
#include<cassert>
using namespace std;
using LL = long long;
const int maxn = 1e6 + 5;
bool isPrime[maxn];
int primes[maxn], minp[maxn], cnt;
void init(){
    isPrime[1] = 1;
    for(int i = 2; i < maxn; i++){
        if (!isPrime[i]){
            primes[cnt++] = i;
            minp[i] = i;
        }
        for(int j = 0; i * primes[j] < maxn; j++){
            minp[i * primes[j]] = primes[j];
            isPrime[i * primes[j]] = 1;
            if (i % primes[j] == 0) break;
        }
    }
}	

int main(){

#ifdef LOCAL
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
#endif

    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);

    init();
    int T;
    cin >> T;
    while(T--){
        int n, k;
        cin >> n >> k;
        if ((n - k) % 2 == 1){
            cout << -1 << '\n';
            continue;
        }
        int need = (n - k) / 2;
        vector<int> p1;
        for(int i = 0; primes[i] * 2 <= n and p1.size() < 7; i++){
            p1.push_back(primes[i]);
        }
        vector<int> p2;
        for(int i = 1; i <= n; i++){
            if (i * 2 > n and !isPrime[i]){
                p2.push_back(i);
            }
        }
        vector<int> cnt(n + 1);
        for(int i = 1; i <= n; i++){
            int t = i;
            int x = 1;
            while(t > 1){
                int p = minp[t];
                int c = 0;
                while(t % p == 0) t /= p, c ^= 1;
                if (c) x *= p;
            }
            cnt[x] += 1;
        }
        for(int i = 1; i <= n; i++){
            for(int j = 2 * i; j <= n; j += i){
                cnt[i] += cnt[j];
            }
        }
        const int m = p1.size();
        bool ok = false;
        for(int i = 0; i < 1 << m; i++){
            vector<int> ps;
            for(int j = 0; j < m; j++){
                if (i >> j & 1){
                    ps.push_back(p1[j]);
                }
            }
            int S = ps.size();
            vector<int> mul(1 << S, 1), c(1 << S);
            for(int s = 1; s < 1 << S; s++){
                int lb = __lg(s);
                mul[s] = mul[s ^ (1 << lb)] * ps[lb];
            }
            for(int s = 0; s < 1 << S; s++){
                c[s] = cnt[mul[s]];
            }
            for(int t = 0; t < S; t++){
                for(int s = 0; s < 1 << S; s++){
                    if (s >> t & 1){
                        c[s ^ (1 << t)] -= c[s];
                    }
                }
            }
            int tot = 0;
            for(int s = 1; s < 1 << S; s++){
                if (__builtin_parity(s)){
                    tot += c[s];
                }
            }
            if (need >= tot and need <= tot + p2.size()){
                vector<int> ans(n + 1);
                for(int i = 0; i < need - tot; i++){
                    ans[p2[i]] = -1;
                }
                for(int i = 1; i <= n; i++){
                    if (i * 2 > n and !isPrime[i]){
                        if (ans[i] == 0) ans[i] = 1;
                        continue;
                    }
                    int c = 0;
                    int t = i;
                    for(auto x : ps){
                        while(t % x == 0) t /= x, c ^= 1;
                    }
                    ans[i] = c ? -1 : 1;
                }
                int sum = 0;
                for(int i = 1; i <= n; i++){
                    sum += ans[i];
                    cout << ans[i] << " \n"[i == n];
                }
                assert(sum == k);
                ok = true;
                break;
            }
        }
        if (!ok){
            cout << -1 << '\n';
        }
    }

}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 6ms
memory: 12608kb

input:

4
4 2
10 0
10 1
10 10

output:

1 1 -1 1
1 -1 1 1 1 -1 -1 -1 1 -1
-1
1 1 1 1 1 1 1 1 1 1

result:

ok ok (4 test cases)

Test #2:

score: 0
Accepted
time: 34ms
memory: 10220kb

input:

11475
1 0
1 1
2 0
2 1
2 2
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...

output:

-1
1
1 -1
-1
1 1
-1
1 -1 1
-1
1 1 1
1 -1 -1 1
-1
1 1 -1 1
-1
1 1 1 1
-1
1 1 -1 1 -1
-1
1 1 -1 1 1
-1
1 1 1 1 1
1 -1 1 1 -1 -1
-1
1 -1 1 1 1 -1
-1
1 1 1 1 -1 1
-1
1 1 1 1 1 1
-1
1 -1 1 1 -1 -1 1
-1
1 1 1 1 -1 1 -1
-1
1 1 1 1 -1 1 1
-1
1 1 1 1 1 1 1
1 -1 1 1 -1 -1 1 -1
-1
1 -1 1 1 1 -1 1 -1
-1
1 1 1 1...

result:

ok ok (11475 test cases)

Test #3:

score: 0
Accepted
time: 48ms
memory: 12296kb

input:

8825
151 0
151 1
151 2
151 3
151 4
151 5
151 6
151 7
151 8
151 9
151 10
151 11
151 12
151 13
151 14
151 15
151 16
151 17
151 18
151 19
151 20
151 21
151 22
151 23
151 24
151 25
151 26
151 27
151 28
151 29
151 30
151 31
151 32
151 33
151 34
151 35
151 36
151 37
151 38
151 39
151 40
151 41
151 42
151 ...

output:

-1
1 -1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 1 1 ...

result:

ok ok (8825 test cases)

Test #4:

score: -100
Runtime Error

input:

5675
201 1
201 3
201 5
201 7
201 9
201 11
201 13
201 15
201 17
201 19
201 21
201 23
201 25
201 27
201 29
201 31
201 33
201 35
201 37
201 39
201 41
201 43
201 45
201 47
201 49
201 51
201 53
201 55
201 57
201 59
201 61
201 63
201 65
201 67
201 69
201 71
201 73
201 75
201 77
201 79
201 81
201 83
201 85...

output:

1 -1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 1 1 1 -1 -1...

result: