队内赛 T2数学巡回的梦魇之神喜欢数列
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队内赛 T2数学巡回的梦魇之神喜欢数列相关的知识,希望对你有一定的参考价值。
队内赛 T2 巡回的梦魇之神喜欢数列
题目
输入输出样例
输入 #1
3
3 2
4 5
5 10
输出 #1
4
70
2002
输入 #2
10
548663 274643
691753 303423
272071 784649
445453 338151
943278 472896
935376 506928
466125 884296
645556 201996
901126 364020
729913 617772
输出 #2
940823646
795574192
329639602
510984487
583021519
374869018
732112691
34420445
555105650
285447896
解题思路
先将
a
1
,
2
,
3
,
.
.
.
a_{1,2,3,...}
a1,2,3,...的式子拆一下(
a
1
=
k
,
a
2
=
k
2
(
k
+
1
)
,
a
3
=
k
3
(
k
2
(
k
+
1
)
+
k
+
1
)
,
.
.
.
a_1 = k, a_2 = \\frac{k}{2}(k + 1), a_3 = \\frac{k}{3}(\\frac{k}{2}(k + 1) + k + 1),...
a1=k,a2=2k(k+1),a3=3k(2k(k+1)+k+1),...)
把分数合并一下(
a
1
=
k
1
,
a
2
=
k
2
∗
(
k
+
1
)
,
a
3
=
k
3
(
k
+
1
)
∗
k
+
2
2
,
.
.
.
a_1=\\frac{k}{1}, a_2 = \\frac{k}{2}*(k+1), a_3 = \\frac{k}{3}(k + 1)*\\frac{k+2}{2},...
a1=1k,a2=2k∗(k+1),a3=3k(k+1)∗2k+2,...)
a
n
=
k
n
∗
k
+
1
1
∗
k
+
2
2
∗
.
.
.
∗
k
+
n
−
1
n
−
1
=
k
∗
(
k
+
1
)
∗
(
k
+
2
)
∗
.
.
.
∗
(
k
+
n
−
1
)
1
∗
2
∗
3
∗
.
.
.
∗
n
a_n = \\frac{k}{n}*\\frac{k+1}{1}*\\frac{k+2}{2}*...*\\frac{k+n-1}{n-1}=\\frac{k * (k + 1) * (k + 2)*...*(k+n-1)}{1*2*3*...*n}
an=nk∗1k+1∗2k+2∗...∗n−1k+n−1=1∗2∗3∗...∗nk∗(k+1)∗(k+2)∗...∗(k+n−1)
分母为 n 的阶乘,分子其实就是 (k + n - 1)! / (k - 1)!
因为要%所以要用逆元
这题不能用线性求逆元,因为阶乘很大,导致 inv[] 下标会超,所以只能实时求逆元
复杂度O(T·lgn)
Code
#include <bits/stdc++.h>
#define P 1000000007
#define N 10000100
#define ll unsigned long long
using namespace std;
ll jc[N], inv[N];
ll T, n, k;
ll ksm(ll a, ll b) {
ll ans = 1;
for(; b; b >>= 1, a = a * a % P)
if(b & 1) ans = ans * a % P;
return ans;
}
int main() {
jc[0] = jc[1] = 1;
inv[1] = 1;
for(int i = 2; i <= N - 100; i ++)
jc[i] = jc[i - 1] * i % P;
scanf("%lld", &T);
while(T --) {
scanf("%lld %lld", &n, &k);
printf("%lld\\n", jc[k + n - 1] * ksm(jc[k - 1], P - 2) % P * ksm(jc[n], P - 2) % P);
}
}
以上是关于队内赛 T2数学巡回的梦魇之神喜欢数列的主要内容,如果未能解决你的问题,请参考以下文章