QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#698621#7679. Master of Both IVjiangzhihui#TL 0ms3532kbC++144.6kb2024-11-01 20:51:112024-11-01 20:51:11

Judging History

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

  • [2024-11-01 20:51:11]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3532kb
  • [2024-11-01 20:51:11]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std ;
const int mod = 998244353 ;
int norm(int x)
{
	if(x < 0)  x += mod ;
	if(x >= mod)  x -= mod ;
	return x ;
}
template<class T>
T power(T a , int b)
{
	T res = 1 ;
	for( ; b ; b /= 2 , a *= a)
	if(b % 2)  res *= a ;
	return res ;
}
template<class T>
T print(T a , int b)
{
	T res = 1 ;
	for( ; b ; b /= 2 , a *= a)
	if(b % 2)  res *= a ;
	return res ;
}
struct mint
{
	int x ;
	mint(int x = 0) : x(norm(x)) {}
	int val() const
	{
		return x ;
	}
	mint operator-() const
	{
		return mint(norm(mod - x)) ;
	}
	mint inv() const
	{
		assert(x != 0);
		return power(*this, mod - 2) ;
	}
	mint &operator*=(const mint &rhs)
	{
		x = (long long)x * rhs.x % mod ;
		return *this ;
	}
	mint &operator+=(const mint &rhs)
	{
		x = norm(x + rhs.x) ;
		return *this ;
	}
	mint &operator-=(const mint &rhs)
	{
		x = norm(x - rhs.x) ;
		return *this ;
	}
	mint &operator/=(const mint &rhs)
	{
		return *this *= rhs.inv() ;
	}
	friend mint operator*(const mint &lhs , const mint &rhs)
	{
		mint res = lhs ;
		res *= rhs ;
		return res ;
	}
	friend mint operator+(const mint &lhs , const mint &rhs)
	{
		mint res = lhs ;
		res += rhs ;
		return res ;
	}
	friend mint operator-(const mint &lhs , const mint &rhs)
	{
		mint res = lhs ;
		res -= rhs ;
		return res ;
	}
	friend mint operator/(const mint &lhs , const mint &rhs)
	{
		mint res = lhs ;
		res /= rhs ;
		return res ;
	}
} ;
ostream& operator<<(std::ostream& os, const mint& m) 
{
	os << m.x ;
	return os ;
}
vector<mint> fac ;
vector<mint> inv ;
void init(int n)
{
	n <<= 1 ;
	fac.resize(0) ;
	fac.resize(n + 10 , mint(1)) ;
	inv.resize(0) ;
	inv.resize(n + 10 , mint(1)) ;
	for(int i = 2 ; i <= n ; i ++)  fac[i] = fac[i - 1] * i ;
	inv[n] = fac[n].inv() ;
	for(int i = n - 1 ; i >= 1 ; i --)  inv[i] = inv[i + 1] * (i + 1) ;
}
mint C(int n , int m)
{
	if(n < 0 || m < 0 || n < m)  return mint(0) ;
	return fac[n] * inv[m] * inv[n - m] ;
}
using ll = long long ;
struct Linear_base
{
	bool zero ;
	int cnt ;
	ll b[75] , p[75] ;
	void init()
	{
		zero = 0 ;
		cnt = 0 ;
		memset(b , 0 , sizeof(b)) ;
		memset(p , 0 , sizeof(p)) ;
	}
	bool insert(ll x)
	{
		for(int i = 60 ; i >= 0 ; i --)
		if(x & (1ll << i))
		{
			if(b[i])  x ^= b[i] ;
			else  
			{
                cnt += 1 ;
				b[i] = x ;
				return 1 ;
			}
		}
		zero = 1 ;
		return 0 ;
	}
	ll get_max()
	{
		ll ans = 0 ;
		for(int i = 60 ; i >= 0 ; i --)
		if((ans ^ b[i]) > ans)  ans ^= b[i] ;
		return ans ;
	}
	ll get_min()
	{
		if(zero)  return 0 ;
		for(int i = 0 ; i <= 60 ; i ++)
		if(b[i])  return b[i] ;
		return 0 ;
	}
	void rebuild()
	{
		cnt = 0 ;
		for(int i = 60 ; i >= 0 ; i --)
		if(b[i])
		{
			for(int j = i - 1 ; j >= 0 ; j --)
			if(b[i] & (1ll << j))  b[i] ^= b[j] ;
		}
		for(int i = 0 ; i <= 60 ; i ++)
		if(b[i])  p[cnt ++] = b[i] ;
	}
	ll kth(ll k)
	{
		ll ans = 0 ;
		if(zero)  k -- ;
		if(k == 0)  return 0 ;
		if(k >= (1ll << cnt))  return -1 ;
		for(int i = 0 ; i <= cnt - 1 ; i ++)
		if(k & (1ll << i))  ans ^= p[i] ;
		return ans ;
	}
} linear_base ;
void solve()
{
    int n ;
    cin >> n ;
    init(n) ;
    vector<int> a(n) ;
    for(int i = 0 ; i < n ; i ++)  cin >> a[i] ;
    sort(a.begin() , a.end()) ;
    vector<int> c(n) ;
    mint ans = 0 ;
    for(int i = 0 ; i < n ; i ++)  c[a[i]] += 1 ;
    vector<mint> f(n + 1 , mint(0)) ;
    for(int i = 1 ; i <= n ; i ++)
    {
        if(c[i] == 0)
        {
            f[i] = 1 ;
            continue ;
        }
        int m = c[i] ;
        for(int j = 0 ; j <= m ; j += 2)
        {
            f[i] += C(m , j) ;
        }
    }
    vector<mint> g(n + 1 , mint(0)) ;
    for(int i = 1 ; i <= n ; i ++)
    {
        for(int j = 1 ; j <= c[i] ; j += 2)  g[i] += C(c[i] , j) ;
    }
    for(int i = 1 ; i <= n ; i ++)
    {
        mint val = 1 ;
        for(int j = 1 ; j * j <= i ; j ++)
        {
            if(i % j != 0)  continue ;
            val *= f[j] ;
            if(j * j != i)  
            {
                if(j == 1)  val *= g[i / j] ;
                else  val *= f[i / j] ;
            }
        }
        // cout << val << "??\n" ;
        ans += val ;

    }
    linear_base.init() ;
    for(auto u : a)  linear_base.insert(u) ;
    if(linear_base.zero)  ans += power(mint(2) , n - linear_base.cnt) ;
    cout << ans - 1 << '\n' ;
}
int main()
{
    std::ios::sync_with_stdio(false) , cin.tie(0) ;

    int T ;
    cin >> T ;
    while (T --)  solve() ;
    return 0 ;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3532kb

input:

2
3
1 2 3
5
3 3 5 1 1

output:

4
11

result:

ok 2 number(s): "4 11"

Test #2:

score: -100
Time Limit Exceeded

input:

40000
5
4 2 5 5 5
5
5 5 5 5 4
5
1 4 4 4 2
5
2 5 2 4 1
5
3 2 4 5 3
5
1 5 5 3 4
5
5 5 5 4 3
5
4 3 3 5 1
5
4 5 5 2 1
5
2 5 4 2 5
5
3 4 3 4 3
5
5 3 5 1 3
5
5 1 2 4 4
5
4 2 5 1 5
5
5 4 2 5 4
5
5 2 5 2 4
5
1 4 5 4 5
5
4 2 3 2 3
5
1 4 1 3 5
5
1 1 2 1 5
5
5 2 5 1 3
5
3 1 2 5 3
5
5 5 1 1 5
5
2 2 2 1 3
5
3 1 ...

output:

10
73
73
136
264
535329173
447490390
705310006
409168397
862612565
862612571
6
533491982
897402095
590119006
253463469
395877840
246002542
960669055
264038464
608311659
861422093
865145293
49912316
382660431
966636787
166349398
609245983
609245984
978763414
136673316
8
10
7
240477845
8
139760127
220...

result: