QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#445905#6512. Completely Multiplicative FunctionWavelet#WA 28ms6524kbC++142.3kb2024-06-16 16:59:272024-06-16 16:59:27

Judging History

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

  • [2024-06-16 16:59:27]
  • 评测
  • 测评结果:WA
  • 用时:28ms
  • 内存:6524kb
  • [2024-06-16 16:59:27]
  • 提交

answer

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

const int MAXN = 1e6 + 3;

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

map <pair<int, int>, vector<int> > M;

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;

    for(int n = 1;n <= 20;++ n){
        vector <int> U;
        for(int i = 2;i <= n;++ i)
            if(!P[i])
                U.push_back(i);
        int m = 1 << U.size();
        for(int s = 0;s < m;++ s){
            int sum = 1, cnt = 0;
            for(int i = 2;i <= n;++ 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.count({n, sum})){
                vector <int> T;
                for(int i = 1;i <= n;++ i)
                    T.push_back(W[i]);
                M[{n, sum}] = T;
            }
        }
    }
    
    int T;
    cin >> T;
    for(int _ = 1;_ <= T;++ _){
        int n, k;
        cin >> n >> k;

        if(n <= 20){
            // cout << "here" << endl;
            if(M.count({n, k})){
                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 = ceil(sqrt(n));
        int w = n;

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

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

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 7ms
memory: 6524kb

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: 28ms
memory: 4752kb

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 f[25] != f[5] * f[5] (test case 326)