トピックリンク:Xiaoqiのピラミッド
題名
Xiaoqiは異なるポイント間を移動できます。Xiaoqiが(x 1、y 1){(x_1、y_1)}にあると仮定します(x1、そして1)、彼が次に移動できるポイント(x 2、y 2){(x_2、y_2)}(x2、そして2)满足(x 2> = x 1&&y 2> = y 1){(x_2> = x_1 \&\&y_2> = y_1)}(×2> =バツ1&&Y2> =そして1)。今Xiaoqiは(k、k)((k、k))にとどまります(k 、k )では、Xiaoqiがどこにいるかは不明なので、すべてのポイントで到達した計画の数の合計を求める必要があります。
回答
カトレアの数字に手を出すなら、この質問をすることができます。
直接押すのは少し難しいですが、ゲームでは押し出そうとは思わないです。
この質問では、Xiaoqiは3つのポイント(x 1 + 1、y 1)、(x 1、y 1 + 1)、(x 1 + 1、y 1 + 1){(x_1 + 1、y_1)、(x_1 、y_1 + 1)、(x_1 + 1、y_1 + 1)}(x1+1 、そして1)、(x1、そして1+1 )、(x1+1 、そして1+1 )、これはシュローダー数(スーパーカテラン数)の例とまったく同じです。グリッド全体が三角形なので、右端は(k、k){(k、k)}です。(k 、k )は、「y = xこの直線」を置き換えるのと同じであり、このようにして、シュレーダー数(スーパーカテラン数)に対する答えを簡単に得ることができます。
シュレーダー数(超カタラン数)の漸化式:
(n + 1)∗ S n =(6 n − 3)∗ S n − 1 −(n − 2)∗ S n − 2 {(n + 1)* S_n =(6n-3)* S_ {n-1}-(n-2)* S_ {n-2}}(n+1 )∗Sn個=(6 n−3 )∗SN - 1−(n−2 )∗SN - 2(S 0 = 1、S 1 = 1 {S_0 = 1、S_1 = 1}S0=1 、S1=1)
係数のため、sn {s_n}を見つけますsn個ときに、両側に(n + 1)の逆数を掛けます。
ここで配布されたシーケンスS n {S_n}に注意してくださいSn個これは直接シュローダー数(スーパーカテラン数)ではありませんが、最初の項を除いて、残りはシュローダー数(スーパーカテラン数)の半分であるため、必ず2を掛けてください。
タイトルにn≠k.size()があることに注意してください。最初は、nを押し続けて書き込みを行うとセグメンテーション違反が発生し、最終的にk.size()に変更されました。
コード
typedef long long ll;
ll mod=1e9+7;
class Solution {
public:
/**
* @param n: The number of pyramid levels n
* @param k: Possible coordinates k
* @return: Find the sum of the number of plans
*/
ll f[10000010];
ll qpow(ll a, ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return (ans+mod)%mod;
}
int pyramid(int n, vector<int> &k) {
// write your code here
f[1]=f[0]=1;
for(int i=2;i<=n;i++)
{
f[i]=((6*i-3)*f[i-1]%mod-(i-2)*f[i-2]%mod+mod)%mod*qpow(i+1,mod-2)%mod;
}
ll ans=0;
for(int i=0;i<k.size();i++)
{
if(n==k[i]) ans=(ans+f[n-k[i]])%mod;
else ans=(ans+f[n-k[i]]*2%mod)%mod;
}
return ans;
}
};