QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#125236#6512. Completely Multiplicative FunctionUNos_mariconesWA 46ms3584kbC++171.7kb2023-07-16 08:34:272023-07-16 08:34:30

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-16 08:34:30]
  • 评测
  • 测评结果:WA
  • 用时:46ms
  • 内存:3584kb
  • [2023-07-16 08:34:27]
  • 提交

answer

#include<bits/stdc++.h>

using namespace std;

void solve()
{
	int n, k;
	scanf("%d %d", &n, &k );

	if( ( n - k ) % 2 )
	{
		puts("-1");
		return;
	}

	vector< bool > is_prime( n + 1, true );
	vector< int > div( n + 1, -1 );

	vector< int > primes;

	for( int i = 2; i <= n; ++ i )
	{
		if( is_prime[ i ] )
		{
			primes.push_back( i );
			for( int x = 2 * i; x <= n; x += i )
				is_prime[x] = false, div[x] = i;
		}
	}


	if( n <= 76 )//n is also small
	{
		vector< int > sp, gp;
		for( auto p : primes )
		{
			if( 2 * p <= n ) sp.push_back( p );
			else gp.push_back( p );
		}

		const int m = (int) sp.size();
		const int del = (int) gp.size();
		
		vector< int > f ( n + 1, 1 );
		for( int mask = 0; mask <	( 1 << m ); ++ mask )
		{
			for( int i = 0; i < m; ++ i )
			{
				if( mask >> i & 1 )
					f[sp[i]] *= -1;
			}

			for(int i = 2; i <= n; ++ i )
				if( !is_prime[i] )
					f[i] = f[div[i]] * f[i/div[i]];

			int sum = 0;
			for( int i = 1; i <= n; ++ i )
				sum += f[i];

			const int rem = sum - k;
			if( rem >= 0 && rem <= 2 * del )
			{
				for( int i = 0; i < rem / 2; ++ i )
					f[gp[i]] = -1;

				for( int i = 1; i <= n; ++ i )
					cout << f[i] << " \n"[i==n];
				return;
			}
		}

		puts("-1");
		return;
	}

	int rem_minus = ( n - k ) / 2;

	vector< int > f( n + 1, 1 );
	for( auto p : primes )
	{
		if( 1LL * p * p > n &&  rem_minus >= ( n / p ) )
		{
			rem_minus -= ( n / p );
			for( int i = 1; i * p <= n; ++ i )
				f[i*p] *= -1;
		}
	}

	
	for( int i = 1; i <= n; ++ i )
		cout << f[i] << " \n"[i==n];
}

int main()
{
	int t;
	scanf("%d", &t );
	while( t-- )
		solve();

	return 0;
};

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3584kb

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: 36ms
memory: 3536kb

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

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

result:

wrong answer sum of f is not k (test case 2891)