A C
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3121 Accepted Submission(s): 2017
You must learn these two combination formulas in the school . If you have forgotten it , see the picture.
Now I will give you n and m , and your task is to calculate the answer .
Then T cases follows in the T lines.
Each case contains a character 'A' or 'C', two integers represent n and m. (1<=n,m<=10)
And print the answer in a single line.
2 A 10 10 C 4 2
3628800 6
因为最近在学动态规划,就偷懒了 采用一个捷径。
#include<iostream>
using namespace std;
int c[1000][1000];
int a[1000];
int aa(int m)
{
if(a[m]) return a[m];
if(m==1) return 1;
return m*aa(m-1);
}
int cc(int m,int n)
{
if(c[m][n]) return c[m][n];//如果计算过 则直接输出
//状态转移方程 c(m,n)=c(m-1,n-1)+c(m-1,n)
if(m==n || n==0) return 1;
if(n==1) return m;
return cc(m-1,n-1)+cc(m-1,n);
}
int main()
{
int m,n,cas;
char s;
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
cin>>cas;
while(cas--)
{
cin>>s>>m>>n ;
if(s=='C')
cout<<cc(m,n)<<endl;
else
cout<<cc(m,n)*aa(n)<<endl;
}
}