題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2519
原來可以有遞推公式的。。。c[n][m]=c[n-1][m]+c[n-1][m-1];
orz。。。自己搞了個階乘。。。orz。。。還用string來處理了。。小題大做了。。。
View Code
1 #include<iostream>
2 #include<algorithm>
3 #include<string>
4 #include<vector>
5 using namespace std;
6 vector<string>vet;
7
8 string facs(const string &str,int num){
9 int len=str.size();
10 int c=0,l=0;
11 string s="";
12 for(int i=len-1;i>=0;i--){
13 c=l+(str[i]-'0')*num;
14 s+=c%10+'0';
15 l=c/10;
16 }
17 while(l){
18 s+=l%10+'0';
19 l/=10;
20 }
21 reverse(s.begin(),s.end());
22 return s;
23 }
24
25 void Initiate(){
26 vet.push_back("0");
27 vet.push_back("1");
28 vet.push_back("2");
29 string str="2";
30 for(int i=3;i<=31;i++){
31 str=facs(str,i);
32 vet.push_back(str);
33 }
34 }
35
36 string Divide(const string &s1,int n){
37 string s="";
38 int len=s1.size();
39 int c=0,l=0;
40 for(int i=0;i<len;i++){
41 c=l*10+s1[i]-'0';
42 l=c%n;
43 c=c/n;
44 if(c==0&&s.size()==0)continue;
45 else s+=c+'0';
46 }
47 return s;
48 }
49
50
51
52 int main(){
53 Initiate();
54 int _case;
55 scanf("%d",&_case);
56 while(_case--){
57 int n,m;
58 scanf("%d%d",&n,&m);
59 if(n==m){
60 printf("1\n");
61 }else if(n<m){
62 printf("0\n");
63 }else {
64 string s1=vet[n];
65 for(int i=2;i<=m;i++){
66 s1=Divide(s1,i);
67 }
68 for(int i=2;i<=(n-m);i++){
69 s1=Divide(s1,i);
70 }
71 cout<<s1<<endl;
72 }
73 }
74 return 0;
75 }