题意: 把
M
个同样的苹果放在
Input
第一行是测试数据的数目
t(0<=t<=20)
。以下每行均包含二个整数M和N,以空格分开。
1<=M,N<=10
。
Output
对输入的每组数据
M
和
Sample Input
1
7 3
Sample Output
8
思路: 想法其实很简单,直接
1、
m<n
的情况,
fn(m,n)=fn(m,m)
,很好理解m个苹果最多能放m个盘子,又因为盘子都一样。
2、
m>=n
,
fn(m,n)=fn(m−n,n)+fn(m,n−1)
,这个式子表示,先把每个盘子里放一个苹果在放其他的也就是
fn(m−n,n)
,留一个空盘子不放也就是
fn(m,n−1)
。
最后结束递归的条件是
fn(m,n)
if(m==0||n==1||m==1)
时返回1。
AC代码:
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long
#define eps 1e-8
const ll maxn = 100005;
const ll mod = 1e9+7;
ll fn(ll m,ll n)///int型的也可以
{
if(m==0||n==1||m==1)
return 1;
if(n>m)
return fn(m,m);
else
return fn(m,n-1)+fn(m-n,n);
}
int main()
{
int T;
ll m,n;
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d",&m,&n);
printf("%I64d\n",fn(m,n));
}
return 0;
}