QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#698621 | #7679. Master of Both IV | jiangzhihui# | TL | 0ms | 3532kb | C++14 | 4.6kb | 2024-11-01 20:51:11 | 2024-11-01 20:51:11 |
Judging History
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...