AcWing 885. 求组合数 I 递推

90 阅读1分钟

AcWing 885. 求组合数 I - AcWing

这道题如果暴力求解的话,一共有10000行测试,每行数据范围2000,那么总共就是200010000=2e72000*10000=2e^7,也就是2千万。

我们预处理一下,a,b的范围是2000,那a.b的不同对数就是20002=4000000=4e62000^2 =4000000=4e^6,也就是400万,400的万的数据我们可以用递推的组合公式两个for循环也不会超时。

我们可以利用下面的公式在4e6 4e^6时间内求出所有值:

image.png

公式怎么来的: image.png

#include<iostream>
using namespace std;
const int N=2010;
const int mod=1e9+7;
int c[N][N];
int n;
void sovel()
{
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<=i;j++)
        {
            if(!j)c[i][j]=1;//从i中取0个苹果,就是不取,不取也是一种方案
            else c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
        }
    }
}
int main()
{
    cin>>n;
    while(n--)
    {
        int a=0,b=0;
        cin>>a>>b;
        sovel();
        cout<<c[a][b]<<endl;
    }
    return 0;
}