QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#445924#6512. Completely Multiplicative FunctionWavelet#WA 330ms5372kbC++142.4kb2024-06-16 17:16:062024-06-16 17:16:06

Judging History

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

  • [2024-06-16 17:16:06]
  • 评测
  • 测评结果:WA
  • 用时:330ms
  • 内存:5372kb
  • [2024-06-16 17:16:06]
  • 提交

answer

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

const int MAXN = 1e6 + 3;

int W[MAXN]; bool P[MAXN];
int o = 1e6;

vector<int> M[100][100];

int main(){
    // ios :: sync_with_stdio(false);
    // cin.tie(nullptr);

    for(int i = 2;i <= o;++ i){
        for(int j = 2;1ll * i * j <= o;++ j)
            P[i * j] = true;
    }

    W[1] = 1;

    int m = 1 << 20;
        
    for(int s = 0;s < m;++ s){
        int sum = 1, cnt = 0;
        for(int i = 2;i <= 80;++ i){
            if(!P[i])
                W[i] = (s & (1 << cnt)) ? -1 : 1, cnt ++;
            else {
                for(int j = 2;j < i;++ j){
                    if(i % j == 0){
                        W[i] = W[j] * W[i / j];
                        break;
                    }
                }
            }
            sum += W[i];
            if(sum >= 0 && M[i][sum].empty()){
                vector <int> T;
                for(int j = 1;j <= i;++ j)
                    T.push_back(W[j]);
                M[i][sum] = T;
            }
        }
    }

    // for(int n = 2;n <= 80;++ n){
    //     for(int i = 1;i <= n;++ i)
    //         cout << M[n][i].empty() << " \n"[i == n];
    // }
    
    int T;
    cin >> T;
    for(int _ = 1;_ <= T;++ _){
        int n, k;
        cin >> n >> k;

        if(n <= 80){
            // cout << "here" << endl;
            if(!M[n][k].empty()){
                auto &T = M[n][k];
                for(auto &u: T)
                    cout << u << " ";
                cout << "\n";
            } else {
                cout << -1 << "\n";
            }

            continue;
        }

        for(int i = 1;i <= n;++ i)
            W[i] = 1;
        
        int m = floor(sqrt(n));
        int w = n;

        for(int i = m + 1;i <= n;++ i) if(!P[i]){
            int x = n / i;

            // cout << i << ": " << x << endl;

            if(w - 2 * x >= k){
                w -= 2 * x;
                
                for(int j = 1;1ll * i * j <= n;++ j)
                    W[i * j] *= -1;
            }
        }

        int tot = 0;

        if(w == k){
            for(int i = 1;i <= n;++ i)
                cout << W[i] << " \n"[i == n], tot += W[i];
        } else {
            cout << -1 << "\n";
        }

        // cerr << "tot = " << tot << endl;
    }
    return 0;;
}
/*
1 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 296ms
memory: 5180kb

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

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 ...

result:

wrong answer ans finds the answer, but out doesn't (test case 2)