Solution

比赛的时候手推,发现规律,然后打了个表。
看到了如下的规律:

 0 : 1
 1 : 1 1 1
 2 : 1 2 0 2 1
 3 : 1 0 0 1 0 0 1
 4 : 1 1 1 1 1 1 1 1 1
 5 : 1 2 0 0 0 0 0 0 0 2 1
 6 : 1 0 0 2 0 0 0 0 0 2 0 0 1
 7 : 1 1 1 2 2 2 0 0 0 2 2 2 1 1 1
 8 : 1 2 0 1 2 0 1 2 0 2 1 0 2 1 0 2 1
 9 : 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
10 : 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1
11 : 1 2 0 2 1 0 0 0 0 1 2 0 2 1 0 0 0 0 1 2 0 2 1
12 : 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1
13 : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
14 : 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1
15 : 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1
16 : 1 1 1 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 1 1 1
17 : 1 2 0 1 2 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 2 1 0 2 1
18 : 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1
19 : 1 1 1 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 1 1 1
20 : 1 2 0 2 1 0 0 0 0 2 1 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 1 2 0 0 0 0 1 2 0 2 1
21 : 1 0 0 1 0 0 1 0 0 2 0 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 0 2 0 0 1 0 0 1 0 0 1
22 : 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
23 : 1 2 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 2 1
24 : 1 0 0 2 0 0 0 0 0 1 0 0 2 0 0 0 0 0 1 0 0 2 0 0 0 0 0 2 0 0 1 0 0 0 0 0 2 0 0 1 0 0 0 0 0 2 0 0 1
25 : 1 1 1 2 2 2 0 0 0 1 1 1 2 2 2 0 0 0 1 1 1 2 2 2 0 0 0 2 2 2 1 1 1 0 0 0 2 2 2 1 1 1 0 0 0 2 2 2 1 1 1
26 : 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1
27 : 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
28 : 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
29 : 1 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 2 1
30 : 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1

然后我太菜了,就到此为止了。

看了下题解的做法一,发现很巧妙,因为我们求的是对取模后的答案,所以我们将题目里的多项式配上一个对答案不造成影响!


由二项式定理可知:
对于展开式中含有项的为,系数为

代入得,对于的奇偶性有关,

  1. 是奇数
  2. 是偶数

Code_bruceforce

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

constexpr ll N = 1e6 + 5;

int f[100][N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    f[0][0] = 1;
    cout << setw(2) << 0 << " : " << 1 << "\n";
    for (int i = 1; i <= 30; i++) {
        cout << setw(2) << i << " : ";
        for (int j = 0; j <= 2 * i; j++) {
            if (j - 2 >= 0) f[i][j] += f[i - 1][j - 2];
            if (j - 1 >= 0) f[i][j] += f[i - 1][j - 1];
            f[i][j] += f[i - 1][j];
            f[i][j] %= 3;
            cout << f[i][j] << " \n"[j == 2 * i];
        }
    }

    return 0;
}

Code

#include <bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define lowbit(x) ((x) & -(x))

using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;

constexpr double eps = 1e-8;
constexpr int NINF = 0xc0c0c0c0;
constexpr int INF = 0x3f3f3f3f;
constexpr ll mod = 3;
constexpr ll N = 1e6 + 5;

/*
    (x ^ 2 + x + 1) ^ n
    = (x ^ 2 - 2 * x + 1) ^ n
    = (x - 1) ^ (2 * n)

    ans = C(2 * n, k) x ^ k * (-1) ^ (2 * n - k) % 3
*/

ll p = 3;

inline ll qpow(ll a, ll b) {
    ll base = a % p;
    ll ans = 1;
    while (b > 0) {
        if (b & 1) ans = (ans * base) % p;
        base = base * base % p;
        b >>= 1;
    }
    return ans;
}

inline ll C(ll n, ll m) {
    if (n < m) return 0;//组合数n<m特判
    if (m > n - m) m = n - m;//组合数性质
    ll a = 1, b = 1;
    for (int i = 0; i < m; i++) {
        a = (a * (n - i) % p);//组合数分子 a 
        b = (b * (i + 1)) % p;//组合数分母 b
    }
    return a * qpow(b, p - 2) % p;//费马小定理 a/b=a*b^(p-2) 
}

inline ll Lucas(ll n, ll m) {
    if (m == 0) return 1;
    return Lucas(n / p, m / p) * C(n % p, m % p) % p;
}

void solve() {
    ll n, k;
    cin >> n >> k;
    n = 2 * n;
    cout << (Lucas(n, k) * ((n - k) & 1 ? -1 : 1) % mod + mod) % mod << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        solve();
    }

    return 0;
}