题目链接:http://acm.sdtbu.edu.cn/vjudge/contest/view.action?cid=2199#problem/E
题目大意:给你x、y,输出F(x,y),然后F(x,y) = x/y * F( x-1 , y-1 ) ,如果y==1时,F(x,1)=1- (该行后面的加和)
递归写的代码,其实打个表也可以
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=100100;
struct A
{
ll a,b;
bool flag=0;
}s[410][410];
A ADD(A x,A y)
{
A ans;
ans.b=(x.b*y.b)/(__gcd(x.b,y.b));
ans.a=(x.a*(ans.b/x.b))+(y.a*(ans.b/y.b));
ll t=__gcd(ans.a,ans.b);
ans.a/=t;
ans.b/=t;
return ans;
}
A MUL(A x,A y)
{
A ans;
ans.a=x.a*y.a;
ans.b=x.b*y.b;
ll t=__gcd(ans.a,ans.b);
ans.a/=t;
ans.b/=t;
return ans;
}
A cc(ll x,ll y)
{
if(s[x][y].flag==1)
return s[x][y];
if(x==0&&y==1)
{
A r;
r.a=1;r.b=1;
return r;
}
if(y==1)
{
A yi;
yi.a=1;
yi.b=1;
for(ll i=2;i<=x+1;i++)
{
A t;
t=cc(x,i);
t.a*=(-1);
yi=ADD(yi,t);
}
s[x][y]=yi;
s[x][y].flag=1;
return yi;
}
A t,w,ans;
t.a=x;
t.b=y;
w=cc(x-1,y-1);
ans=MUL(t,w);
s[x][y]=ans;
s[x][y].flag=1;
return ans;
}
int main()
{
ll T;
cin>>T;
while(T--)
{
ll k,x,y;
cin>>k>>x>>y;
A ans=cc(x,y);
if(ans.b<0)
{
ans.b*=(-1);
ans.a*=(-1);
}
if(ans.b!=1)
cout<<k<<" "<<ans.a<<"/"<<ans.b<<endl;
else
cout<<k<<" "<<ans.a<<endl;
}
return 0;
}