数论简单题 【组合数】
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:
数论简单题
(simple.cpp/in/out 1s 256M)
由于最终结果可能超过int的范围,因此请将运算结果对1000000007取模。
Input
第1行,一个整数T(T <= 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\n",c[n][m]); 22 } 23 return 0; 24 }