题意:求多项幂和的对应系数,由于题目已经给出公式,所以较简单。
关键是每一行第一列的值,只要用其余行的分数相加,1减去其和即可。
求 a/b + c/d 的和,可以化为:(a*d + b * c)/ (b*d),然后再约分即可。
求分数的差和求分数的和是一样的思路。
本题即利用这个思路:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define LL long long
#define Maxn 405
LL f[Maxn][Maxn],g[Maxn][Maxn];
LL d;
LL gcd(LL a,LL b)
{
if(b == 0) return a;
return gcd(b,a%b);
}
void init()
{
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
f[0][1] = g[0][1] = 1;
LL fz,fm;
for(int i=1;i<=400;i++)
{
fz = 0,fm = 1;
for(int j=2;j<=i+1;j++)
{
f[i][j] = i * f[i-1][j-1];
g[i][j] = j * g[i-1][j-1];
d = gcd(f[i][j],g[i][j]);
if(d!=0)
{
f[i][j] /= d;
g[i][j] /= d;
}
fz = fz * g[i][j] + fm * f[i][j];
fm *= g[i][j];
d = gcd(fz,fm);
if(d!=0)
{
fz /= d;
fm /= d;
}
}
f[i][1] = fm - fz;
g[i][1] = fm;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
init();
int p;
int m,r,c;
scanf(" %d",&p);
while(p--)
{
scanf(" %d %d %d",&m,&r,&c);
printf("%d ",m);
if(f[r][c] == 0) printf("0\n");
else if(f[r][c] % g[r][c] == 0) printf("%lld\n",f[r][c]/g[r][c]);
else if(g[r][c] < 0) printf("%lld/%lld\n",-f[r][c],-g[r][c]);
else printf("%lld/%lld\n",f[r][c],g[r][c]);
}
return 0;
}