Faulhaber's Triangle(递归写法)

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/Septembre_/article/details/88806596