Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36812
  • 博文数量: 13
  • 博客积分: 933
  • 博客等级: 军士长
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-11 21:01
文章分类

全部博文(13)

文章存档

2011年(1)

2010年(12)

最近访客

分类:

2010-08-16 15:40:40

//个人认为自己的思路不错

#include
#include
#include
#include
using namespace std;

int gcd(int a,int b)
{
 if(a  return gcd(b,a);
 else
 {
  if(b==0)
   return a;
  else
   return gcd(b,a%b);
 }
}

void treat(int *a,int *b)
{
 int tmp=gcd(*a,*b);
 *a=*a/tmp;
 *b=*b/tmp;
}

int main()
{
 int m,n,n_bak;
 while(1)
 {
  scanf("%d%d",&m,&n);
  if(m==0&&n==0)
   break;
  n_bak=n;
  if(n>m-n)
   n=m-n;
  list upm,downn;
  list::iterator iterpos;
  for(int i=1;i<=n;++i)
  {
   upm.push_back(m-n+i);
   downn.push_back(i);
  }
  while(!downn.empty())
  {
   int tmp=*downn.begin();
   while(tmp!=1)
   {
    int tmp_upm=*upm.begin();
    upm.pop_front();
    treat(&tmp,&tmp_upm);
    if(tmp_upm!=1)
     upm.push_back(tmp_upm);
   }
   downn.pop_front();
  }
  int ans=1;
  while(!upm.empty())
  {
   ans*=*upm.begin();
   upm.pop_front();
  }
  printf("%d things taken %d at a time is %d exactly.\n",m,n_bak,ans);
 }
 return 0;
}

阅读(1593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~