2020 Multi-University Training Contest 5

Tetrahedron

1 h 2 = 1 a 2 + 1 b 2 + 1 c 2 \cfrac{1}{h^2}=\cfrac{1}{a^2}+\cfrac{1}{b^2}+\cfrac{1}{c^2} h21=a21+b21+c21

E ( x + y ) = E ( x ) + E ( y ) E(x+y)=E(x)+E(y) E(x+y)=E(x)+E(y)

#include 
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int N = 6e6 + 10;
int n;

ll qpow(ll a, ll b) {
    a %= mod;
    ll res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

ll f[N], sum[N];

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

    for (int i = 1, lim = 6e6; i <= lim; i++) {
        f[i] = qpow(1ll * i * i, mod - 2);
        sum[i] = (sum[i - 1] + f[i]) % mod;
    }

    int T;
    cin >> T;
    while (T--) {
        cin >> n;
        ll a = (qpow(n, mod - 2) * 3) % mod;
        cout << ((a * sum[n]) % mod) << endl;
    }
    return 0;
}

Funny String
Boring Game
Expression
Array Repairing
Alice and Bob
Tree
Set2

Paperfolding

经画图 和撕了N张纸 后发现,左右对折、上下对折之间的顺序没有任何关系,

假设左右对折了 x x x 次,上下对折了 y y y 次,最后横竖裁开,纸片个数 = ( 2 x + 1 ) ( 2 y + 1 ) =(2^x+1)(2^y+1) =(2x+1)(2y+1)

E ( x ) = ∑ x × p ( x ) = ∑ x = 0 n C n x ( 2 x + 1 ) ( 2 n − x + 1 ) 2 n E(x)=\sum x\times p(x)=\sum^n_{x=0} \cfrac{C^x_n(2^x+1)(2^{n-x}+1)}{2^n} E(x)=x×p(x)=x=0n2nCnx(2x+1)(2nx+1)

其中分子部分
∑ x = 0 n C n x ( 2 x + 1 ) ( 2 n − x + 1 ) = ∑ x = 0 n C n x ( 2 n + 2 x + 2 n − x + 1 ) = 2 n ∑ x = 0 n C n x + ( ∑ x = 0 n C n x 2 x + ∑ x = 0 n C n x 2 n − x ) + ∑ x = 0 n C n x \sum^n_{x=0}C^x_n(2^x+1)(2^{n-x}+1)\\=\sum^n_{x=0}C^x_n(2^n+2^x+2^{n-x}+1)\\=2^n\sum^n_{x=0}C^x_n+(\sum^n_{x=0} C^x_n2^x+\sum^n_{x=0} C^x_n2^{n-x})+\sum^n_{x=0} C^x_n x=0nCnx(2x+1)(2nx+1)=x=0nCnx(2n+2x+2nx+1)=2nx=0nCnx+(x=0nCnx2x+x=0nCnx2nx)+x=0nCnx

观察发现
∑ x = 0 n C n x 2 x = ∑ x = 0 n C n x 2 x × 1 n − x = ( 2 + 1 ) n = 3 n \sum^n_{x=0} C^x_n2^x=\sum^n_{x=0} C^x_n2^x\times 1^{n-x}=(2+1)^n=3^n x=0nCnx2x=x=0nCnx2x×1nx=(2+1)n=3n

对,就是化成二项式,就是下面这个↓

( a + b ) n = ∑ k = 0 n C n k a k b n − k (a+b)^n=\sum^n_{k=0}C^k_na^kb^{n-k} (a+b)n=k=0nCnkakbnk
a = 1 a=1 a=1 b = 1 b=1 b=1 时,

( 1 + 1 ) n = ∑ k = 0 n C n k 1 k 1 n − k = ∑ k = 0 n C n k = 2 n (1+1)^n=\sum^n_{k=0}C^k_n1^k1^{n-k}=\sum^n_{k=0}C^k_n=2^n (1+1)n=k=0nCnk1k1nk=k=0nCnk=2n

然后回到本题,同理可得
∑ x = 0 n C n x 2 n − x = ∑ x = 0 n C n x 2 n − x × 1 x = ( 1 + 2 ) n = 3 n \sum^n_{x=0} C^x_n2^{n-x}=\sum^n_{x=0} C^x_n2^{n-x}\times 1^{x}=(1+2)^n=3^n x=0nCnx2nx=x=0nCnx2nx×1x=(1+2)n=3n

因此化简原来的公式可以得出

E ( x ) = 2 n + 1 + 2 × 3 n 2 n E(x)= 2^n+1+\cfrac{2\times3^n}{2^n} E(x)=2n+1+2n2×3n

记个和这题没什么关系的笔记:

裁纸数个数的时候发现,如果只有左右对折 or 上下对折时,记 a x a_x ax 为对折了 x x x 次后纸片的个数

有如下数列:
a 1 = 6 a_1=6 a1=6 a 2 = 10 a_2=10 a2=10 a 3 = 18 a_3=18 a3=18 a 4 = 34 a_4=34 a4=34

a 2 − a 1 = 4 a_2-a_1=4 a2a1=4 a 3 − a 2 = 8 a_3-a_2=8 a3a2=8 a 4 − a 3 = 16 a_4-a_3=16 a4a3=16

求像这种公差为等比数列的通项公式,一般分为如下步骤:

以上面的数列为例,记
a n + 1 = a n + 2 n + 1 a_{n+1}=a_n+2^{n+1} an+1=an+2n+1

然后让等式左右两边都减去同一个数 x x x

a n + 1 − x = a n + 2 n + 1 − x a_{n+1}-x=a_n+2^{n+1}-x an+1x=an+2n+1x

这个数是自己构造的,构造出来的目的是使等式左右两边相似,这里令 x = 2 n + 2 x=2^{n+2} x=2n+2

a n + 1 − 2 n + 2 = a n + 2 n + 1 − 2 n + 2 = a n + 2 n + 1 − 2 × 2 n + 1 = a n − 2 n + 1 a_{n+1}-2^{n+2}=a_n+2^{n+1}-2^{n+2}=a_n+2^{n+1}-2\times2^{n+1}=a_n-2^{n+1} an+12n+2=an+2n+12n+2=an+2n+12×2n+1=an2n+1

发现 a n − 2 n + 1 a_n-2^{n+1} an2n+1 是个公比 q = 1 q=1 q=1 的等比数列,

因此可以直接往前推

a n − 2 n + 1 = . . . = a 1 − 2 2 = 6 − 4 = 2 a_n-2^{n+1}=...=a_1-2^2=6-4=2 an2n+1=...=a122=64=2

a n = 2 n + 1 + 2 a_n=2^{n+1}+2 an=2n+1+2

总结:若存在 a n + 1 = a n + b k a_{n+1}=a_n+b^k an+1=an+bk,则构造通项公式 a n − b k + 1 b − 1 a_n-\cfrac{b^{k+1}}{b-1} anb1bk+1

#include 
using namespace std;
typedef long long ll;
ll n;

namespace MOD { // 取模运算板子
    const ll mod = 998244353;

    ll qpow(ll a, ll b) {
        a %= mod;
        ll res = 1;
        while (b) {
            if (b & 1) res = res * a % mod;
            a = a * a % mod;
            b >>= 1;
        }
        return res;
    }

    ll Mul(ll a, ll b) {
        return (a * b) % mod;
    }

    ll Sub(ll a, ll b) {
        return (a - b + mod) % mod;
    }

    ll Add(ll a, ll b) {
        return (a + b) % mod;
    }
}
using namespace MOD;

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

    int T;
    cin >> T;
    while (T--) {
        cin >> n;
        if (n == 0) cout << 4 << endl;
        else if (n == 1) cout << 6 << endl;
        else {
            ll _2n = qpow(2, n);// 2^n
            ll _3n = qpow(3, n); // 3^n
            ll Inv_2n = qpow(_2n, mod - 2); // 1/2^n

            ll res = Add(1, Add(_2n, Mul(Mul(2, _3n), Inv_2n)));
            cout << res << endl;
        }
    }
    return 0;
}

Function
Exam
Set1
An Easy Matrix Problem

你可能感兴趣的:(多校)