数论简单题 【组合数】

本人水平有限,题解不到为处,请多多谅解

本蒟蒻谢谢大家观看

题目:

数论简单题

(simple.cpp/in/out 1s 256M)

 

由于最终结果可能超过int的范围,因此请将运算结果对1000000007取模。

Input

1行,一个整数TT <= 200000),表示数据组数。

2行至第T+1行,每行两个整数m, n

0 < m <= n <= 2000

Output

T行,每行输出一个整数,代表求和结果。

Sample Input

3

1 1

2 3

3 3

Sample Output

1

3

1

前一个数由后一个数累加而来

可以通过样例分析,是求组合数

组合意义:

循环变量构成一个递增的序列,因此只要在n个数中选出m个数,按从小到大的顺序依次分配给m个循环变量即可,组合数可用DP求杨辉三角得。

由于T很大,需要进行预处理。

时间复杂度O(nm)

code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 2020
 4 #define ll long long 
 5 #define mod 1000000007
 6 ll t,n,m;
 7 ll c[N][N];
 8 int main()
 9 {
10     c[1][0]=c[1][1]=1;
11     for(ll i=2;i<=2011;i++)
12     {    
13         c[i][0]=1;
14         for(ll j=1;j<=2011;j++)
15             c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;//杨辉三角求法 
16     }
17     scanf("%lld",&t);
18     while(t--)
19     {
20         scanf("%lld%lld",&m,&n);
21         printf("%lld
",c[n][m]);
22     }
23     return 0;
24 }
原文地址:https://www.cnblogs.com/nlyzl/p/11713891.html