POJ

来源:互联网 发布:鹰眼摄像头监控软件 编辑:程序博客网 时间:2024/05/21 06:50

Computing the exact number of ways that N things can be taken M at a time can be a great challenge when N and/or M become very large. Challenges are the stuff of contests. Therefore, you are to make just such a computation given the following: 
GIVEN: 5 <= N <= 100; 5 <= M <= 100; M <= N 
Compute the EXACT value of: C = N! / (N-M)!M! 
You may assume that the final value of C will fit in a 32-bit Pascal LongInt or a C long. For the record, the exact value of 100! is: 
93,326,215,443,944,152,681,699,238,856,266,700,490,715,968,264,381,621, 468,592,963,895,217,599,993,229,915,608,941,463,976,156,518,286,253, 697,920,827,223,758,251,185,210,916,864,000,000,000,000,000,000,000,000 
Input
The input to this program will be one or more lines each containing zero or more leading spaces, a value for N, one or more spaces, and a value for M. The last line of the input file will contain a dummy N, M pair with both values equal to zero. Your program should terminate when this line is read.
Output
The output from this program should be in the form: 
N things taken M at a time is C exactly. 
Sample Input
100  620  518  60  0
Sample Output
100 things taken 6 at a time is 1192052400 exactly.20 things taken 5 at a time is 15504 exactly.18 things taken 6 at a time is 18564 exactly.

代码1:

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>using namespace std;typedef long long ll;#define M 105ll n,k;int main(){    ll i,j;    while(cin>>n>>k)    {        if(n==0&&k==0)            break;        if(k==n)        {            cout<<n<<" things taken "<<k<<" at a time is "<<1<<" exactly."<<endl;            continue;        }        cout<<n<<" things taken "<<k<<" at a time is ";        if(n-k<k)            k=n-k;        ll ans=1;        for(i=1;i<=k;i++)        {            ans=ans*(n-i+1)/i;        }        cout<<ans<<" exactly."<<endl;    }    return 0;}


代码2:

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>using namespace std;typedef long long ll;#define M 105ll n,k;int main(){    ll i,j;    while(cin>>n>>k)    {        if(n==0&&k==0)            break;        if(k==n)        {            cout<<n<<" things taken "<<k<<" at a time is "<<1<<" exactly."<<endl;            continue;        }        cout<<n<<" things taken "<<k<<" at a time is ";        if(n-k<k)            k=n-k;        double ans1=1,ans2=1;        for(i=1;i<=k;i++)        {            ans2*=i;            ans1*=n;            n--;        }        printf("%.0lf",(ans1/ans2)); //ans1,ans2用longlong 会出错        cout<<" exactly."<<endl;    }    return 0;}

代码3:

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>using namespace std;typedef long long ll;#define M 105ll n,k;ll c[M][M];void init(){    ll i,j;    for(i=0;i<M;i++)        c[i][0]=1;    for(i=1;i<M;i++)    {        for(j=1;j<=i;j++)        {            c[i][j]=c[i-1][j]+c[i-1][j-1];        }    }}int main(){    init();    while(cin>>n>>k)    {        if(n==0&&k==0)            break;        cout<<n<<" things taken "<<k<<" at a time is "<<c[n][k]<<" exactly."<<endl;    }    return 0;}


原创粉丝点击