欢迎光临
我们一直在努力

杨辉三角【牛客tracker & 每日一题】

杨辉三角

时间限制:1 秒 空间限制:256M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!


题目描述

小F对杨辉三角颇有研究,他把杨辉三角第

n

n

n 行的数提出来,从左到右分别为

a

[

0

]

,

a

[

1

]

,

…

,

a

[

n

−

1

]

a[0], a[1], \\dots, a[n-1]

a[0],a[1],…,a[n−1]。

现在他想知道

∑

i

=

0

n

−

1

i

2

×

a

[

i

]

\\sum_{i=0}^{n-1} i^2 \\times a[i]

∑i=0n−1​i2×a[i] 的值是多少,答案对

998244353

998244353

998244353 取模。


输入描述

输入一个正整数

n

n

n,

n

≤

10

18

n \\le 10^{18}

n≤1018。


输出描述

输出题目中式子的值,答案对

998244353

998244353

998244353 取模。


示例 1

输入:

3

输出:

6


数据范围

  • 1

    ≤

    n

    ≤

    10

    18

    1 \\le n \\le 10^{18}

    1≤n≤1018

解题思路

本题是组合恒等式推导 + 快速幂的数学问题。给定杨辉三角第

n

n

n 行的系数

a

[

i

]

=

(

n

−

1

i

)

a[i] = \\binom{n-1}{i}

a[i]=(in−1​)(

i

=

0

,

1

,

…

,

n

−

1

i=0,1,\\dots,n-1

i=0,1,…,n−1),要求计算

S

=

∑

i

=

0

n

−

1

i

2

⋅

a

[

i

]

(

m

o

d

998244353

)

S = \\sum_{i=0}^{n-1} i^2 \\cdot a[i] \\pmod{998244353}

S=i=0∑n−1​i2⋅a[i](mod998244353) 由于

n

n

n 可达

10

18

10^{18}

1018,无法逐项计算,需要利用二项式系数的矩公式直接得到闭式解。

1. 问题等价转化

杨辉三角第

n

n

n 行(从

1

1

1 开始计数)的第

i

i

i 个数为

a

[

i

]

=

(

n

−

1

i

)

a[i] = \\binom{n-1}{i}

a[i]=(in−1​)。于是目标为

S

=

∑

i

=

0

n

−

1

i

2

(

n

−

1

i

)

S = \\sum_{i=0}^{n-1} i^2 \\binom{n-1}{i}

S=i=0∑n−1​i2(in−1​) 利用

i

2

=

i

(

i

−

1

)

+

i

i^2 = i(i-1) + i

i2=i(i−1)+i,拆分为两个已知的二项式系数加权和:

S

=

∑

i

=

0

n

−

1

i

(

i

−

1

)

(

n

−

1

i

)

+

∑

i

=

0

n

−

1

i

(

n

−

1

i

)

S = \\sum_{i=0}^{n-1} i(i-1)\\binom{n-1}{i} + \\sum_{i=0}^{n-1} i\\binom{n-1}{i}

S=i=0∑n−1​i(i−1)(in−1​)+i=0∑n−1​i(in−1​)

2. 组合恒等式

由二项式定理及其导数可得:

  • 一阶矩:

    ∑

    i

    =

    0

    n

    −

    1

    i

    (

    n

    −

    1

    i

    )

    =

    (

    n

    −

    1

    )

    2

    n

    −

    2

    \\sum_{i=0}^{n-1} i\\binom{n-1}{i} = (n-1)2^{n-2}

    i=0∑n−1​i(in−1​)=(n−1)2n−2

  • 二阶下降阶乘矩:

    ∑

    i

    =

    0

    n

    −

    1

    i

    (

    i

    −

    1

    )

    (

    n

    −

    1

    i

    )

    =

    (

    n

    −

    1

    )

    (

    n

    −

    2

    )

    2

    n

    −

    3

    \\sum_{i=0}^{n-1} i(i-1)\\binom{n-1}{i} = (n-1)(n-2)2^{n-3}

    i=0∑n−1​i(i−1)(in−1​)=(n−1)(n−2)2n−3 因此

    S

    =

    (

    n

    −

    1

    )

    (

    n

    −

    2

    )

    2

    n

    −

    3

    +

    (

    n

    −

    1

    )

    2

    n

    −

    2

    =

    (

    n

    −

    1

    )

    2

    n

    −

    3

    [

    (

    n

    −

    2

    )

    +

    2

    ]

    =

    n

    (

    n

    −

    1

    )

    2

    n

    −

    3

    S = (n-1)(n-2)2^{n-3} + (n-1)2^{n-2} = (n-1)2^{n-3}\\big[(n-2)+2\\big] = n(n-1)2^{n-3}

    S=(n−1)(n−2)2n−3+(n−1)2n−2=(n−1)2n−3[(n−2)+2]=n(n−1)2n−3 该公式对

    n

    ≥

    3

    n \\ge 3

    n≥3 成立。

3. 边界情况
  • n

    =

    1

    n = 1

    n=1:只有

    a

    [

    0

    ]

    =

    1

    a[0]=1

    a[0]=1,

    S

    =

    0

    S = 0

    S=0。

  • n

    =

    2

    n = 2

    n=2:第

    2

    2

    2 行为

    1

    ,

    1

    1,1

    1,1,

    S

    =

    0

    2

    ⋅

    1

    +

    1

    2

    ⋅

    1

    =

    1

    S = 0^2\\cdot1 + 1^2\\cdot1 = 1

    S=02⋅1+12⋅1=1。

  • n

    ≥

    3

    n \\ge 3

    n≥3:直接使用公式

    S

    =

    n

    (

    n

    −

    1

    )

    2

    n

    −

    3

     

    m

    o

    d

     

    M

    S = n(n-1)2^{n-3} \\bmod M

    S=n(n−1)2n−3modM。

4. 算法实现
  • 模数

    M

    =

    998244353

    M = 998244353

    M=998244353(注意代码中误写为

    99824353

    99824353

    99824353,少了一个 4,应修正为

    998244353

    998244353

    998244353)。

  • 对

    n

    ≥

    3

    n \\ge 3

    n≥3,计算

    ans

    =

    (

    n
     

    m

    o

    d

     

    M

    )

    ⋅

    (

    (

    n

    −

    1

    )
     

    m

    o

    d

     

    M

    )

    ⋅

    2

    n

    −

    3

     

    m

    o

    d

     

    M

    \\text{ans} = (n \\bmod M)\\cdot((n-1)\\bmod M)\\cdot 2^{n-3} \\bmod M

    ans=(nmodM)⋅((n−1)modM)⋅2n−3modM

  • 指数

    n

    −

    3

    n-3

    n−3 可达

    10

    18

    10^{18}

    1018,但快速幂的时间复杂度为

    O

    (

    log

    ⁡

    n

    )

    O(\\log n)

    O(logn)(约

    60

    60

    60 次乘法),无需对指数取模即可直接计算;由于底数

    2

    2

    2 与

    M

    M

    M 互质,也可将指数对

    M

    −

    1

    M-1

    M−1 取模,但非必需。

  • 对

    n

    =

    1

    n=1

    n=1 输出

    0

    0

    0,

    n

    =

    2

    n=2

    n=2 输出

    1

    1

    1。

5. 复杂度分析
  • 时间复杂度:快速幂

    O

    (

    log

    ⁡

    n

    )

    O(\\log n)

    O(logn),其余为常数次乘法。

    n

    ≤

    10

    18

    n \\le 10^{18}

    n≤1018,运算量极小。

  • 空间复杂度:

    O

    (

    1

    )

    O(1)

    O(1),仅使用常数个变量。

总结

利用二项式系数的矩公式,将复杂的加权和化简为

n

(

n

−

1

)

2

n

−

3

n(n-1)2^{n-3}

n(n−1)2n−3,再通过快速幂在

O

(

log

⁡

n

)

O(\\log n)

O(logn) 时间内求出模意义下的结果。注意对

n

=

1

,

2

n=1,2

n=1,2 进行特判,并确保模数正确为

998244353

998244353

998244353。

代码内容

#include <bits/stdc++.h>
using namespace std;

#define endl '\\n'
typedef long long ll;
typedef unsigned long long ull;
typedef vector<vector<ll>> vvt;
typedef pair<ll,ll> pll;
const ll N=1e3+10;
const ll INF=1e18;
const ll M=1e6+10;
const ll MOD=99824353;

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

void solve()
{
ll n;
cin>>n;
if(n==1)
{
cout<<0<<endl;
}
else if(n==2)
{
cout<<1<<endl;
}
else
{
cout<<(n%MOD)*((n–1)%MOD)%MOD*qpow(2,n–3)%MOD<<endl;
}
}

int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll t=1;
while(t—)
{
solve();
}
return 0;
}

赞(0)
未经允许不得转载:171主机测评 » 杨辉三角【牛客tracker & 每日一题】
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址