Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define mp make_pair
- #define mt make_tuple
- #define pb push_back
- #define sz(a) (ll)(a).size()
- using namespace std;
- typedef long long ll;
- typedef long double lld;
- const ll mod = 998244353, N = 61;
- vector<ll> fact(N);
- ll powmod(ll a, ll b, ll mod){
- a %= mod;
- if (a == 0) return 0;
- ll product = 1;
- while(b > 0){
- if (b&1){
- product *= a;
- product %= mod;
- --b;
- }
- a *= a;
- a %= mod;
- b /= 2;
- }
- return product;
- }
- ll inverse(ll a, ll mod){
- return powmod(a, mod-2, mod);
- }
- ll nCk(ll n, ll k, ll mod){
- return ((fact[n] * inverse(fact[k], mod) % mod) * inverse(fact[n-k], mod) % mod) % mod;
- }
- void tc(){
- ll n; cin >> n;
- //draw partition
- vector<ll> boris, alex;
- for(ll i = n-1; i >= 1; i -= 4){
- if(i >= 1){
- alex.pb(i);
- }
- if(i-1 >= 1){
- alex.pb(i-1);
- }
- if(i-2 >= 1){
- boris.pb(i-2);
- }
- if(i-3 >= 1){
- boris.pb(i-3);
- }
- }
- sort(alex.begin(), alex.end());
- ll x = 0;
- for(ll j = 1; j <= (n/2 - 2); ++j){
- for(ll i = 0; i < sz(boris); ++i){
- ll lb = lower_bound(alex.begin(), alex.end(), boris[i]) - alex.begin();
- if(n/2 -2 -i < j -1 || lb < j){
- continue;
- }
- ll f1 = nCk(n/2 -2 -i, j-1, mod);
- ll f2 = nCk(lb, j, mod);
- ll p = (f1%mod*f2%mod)%mod;
- x = (x%mod + p%mod)%mod;
- }
- }
- ll half = nCk(n, n/2, mod)/2;
- ll a = (half + x)%mod;
- ll b = half%mod - x - 1;
- if(b < 0){
- b += mod;
- }
- cout << a << " " << b << " " << 1 << "\n";
- }
- int main(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- fact[0] = 1;
- for(ll i = 1; i < N; ++i){
- fact[i] = ((fact[i-1]%mod)*(i%mod))%mod;
- }
- ll t; cin >> t;
- while(t--){
- tc();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement