joj 1595

#include<cstdio>
#include<string.h>
using namespace std;
int a[55];
int b[55];
int outcome[55];
int upper;
int down;
int gcd(int n,int m)
{
    int t=n%m;
    while(t!=0)
    {
        n=m;
        m=t;
        t=n%m;
    }
    return m;
}
void cal()
{
    for(int i=2;i<=down;i++)
    {
        if(b[i]==1)continue;
        for(int j=1;j<=upper;j++)
        {
                if(a[j]%b[i]==0)
                {
                     a[j]=a[j]/b[i];
                     b[i]=1;
                     break;
                }
                 if(b[i]%a[j]==0)
                {
                    b[i]=b[i]/a[j];
                    a[j]=1;
                }
        }
    }
    bool temp=true;
    for(int i=1;i<=down;i++)if(b[i]==1)temp=false;
    if(temp)return;
    int i=1;
    while(i<=down)
    {
        while(b[i]==1&&i<=down)i++;
        while(b[i]!=1&&i<=down)
        {
            int j=1;
            while(j<=upper)
            {
                while(a[j]==1&&j<=upper)j++;
                int ss=gcd(a[j],b[i]);
                b[i]/=ss;
                a[j]/=ss;
                if(b[i]==1)break;
                else j++;
            }
            i++;
        }
    }


}
int calculate()
{
    memset(outcome,0,sizeof(outcome));
    int count=1;
    outcome[count]=a[1];
    for(int i=2;i<=upper;i++)
    {
        int store=0;
        while(a[i]==1)i++;
        for(int j=1;j<=count;j++)
        {
            int u=outcome[j]*a[i]+store;
            outcome[j]=u%10;
            store=u/10;
        }
        if(store>0)
        {
            if(store/10==0)
            {
                outcome[++count]=store;
            }
            else
            {
                outcome[++count]=store%10;
                outcome[++count]=store/10;
                store=0;
            }
        }
    }
    return count;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,m;
    while(scanf("%d%d",&n,&m),n&&m)
    {
        if(n!=m)
        {
            down=m<(n-m)?m:(n-m);
            upper=down;
            for(int i=upper;i>=1;i--) a[i]=n-i+1;
            for(int i=1;i<=down;i++) b[i]=i;
            cal();
            int ss=calculate();
            printf("%d things taken %d at a time is ",n,m);
            for(int i=ss;i>=1;i--)printf("%d",outcome[i]);
            printf(" exactly.\n");
        }
        else
        {
            printf("%d things taken %d at a time is ",n,m);
            printf("1 exactly.\n");
        }
    }
    return 0;
}

你可能感兴趣的:(joj 1595)