SSL2021年10月9日提高B组 Luogu T201842 巡回的梦魇之神喜欢数列【数学】

题目

SSL2021年10月9日提高B组 Luogu T201842 巡回的梦魇之神喜欢数列【数学】

题目

根据题意推式子。
a 0 = 1 a_0=1 a0​=1
a 1 = 1 × k n = k a_1=1\times \displaystyle \frac{k}{n}=k a1​=1×nk​=k
a 2 = ( 1 + k ) k 2 a_2=\displaystyle \frac{(1+k)k}{2} a2​=2(1+k)k​
a 3 = ( 1 + k + ( 1 + k ) k 2 ) k 3 = ( 1 + k ) ( 2 + k ) k 6 a_3=(1+k+\displaystyle \frac{(1+k)k}{2})\displaystyle \frac{k}{3}=\displaystyle \frac{(1+k)(2+k)k}{6} a3​=(1+k+2(1+k)k​)3k​=6(1+k)(2+k)k​

… … …… ……
a n = ( 1 + k ) ( 2 + k ) ( 3 + k ) … ( n − 1 + k ) k n ! = ( n − 1 + k ) ! ( k − 1 ) ! n ! a_n=\displaystyle \frac{(1+k)(2+k)(3+k)…(n-1+k)k}{n!}=\displaystyle \frac{(n-1+k)!}{(k-1)!n!} an​=n!(1+k)(2+k)(3+k)…(n−1+k)k​=(k−1)!n!(n−1+k)!​

所以先预处理阶乘,然后逆元一下就好了。

思路

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int mod=1e9+7;
long long ycl[10000011];
int n,k,T;
long long ksm(long long x,long long y)
{
    long long ans=1;
    while(y!=0)
     {
        if(y&1)
		  ans=(ans*x)%mod;
        x=(x*x)%mod;
        y>>=1;
     }
    return ans%mod;
}
int main()
{
	scanf("%d",&T);
	ycl[0]=1,ycl[1]=1;
	for(int i=2; i<=10000010; i++)
	   ycl[i]=(ycl[i-1]*i)%mod;
	while(T--)
	 {
	 	scanf("%d%d",&n,&k);
	 	long long a=((ycl[n+k-1]*ksm(ycl[k-1],mod-2))%mod)*ksm(ycl[n],mod-2)%mod;
	    printf("%d\n",a);
	 }
	return 0;
}
上一篇:高斯(Gaussian)积分常用式


下一篇:[视频教程] 最新版swoole安装和TASKS功能测试