1、刚开始没思路,后来到网上搜题解,发现是用递推的方法。。。嗯,长知识了。。。
2、0和1的时候特殊处理,其他情况用gcd即可。
#include<cstdio>
#include<cstring>
using namespace std;
long long d[25][150];
long long gcd(long long a,long long b){
return b==0?a:gcd(b,a%b);
}
int main()
{
int n,x;
long long ans,num,g;
while(scanf("%d%d",&n,&x)==2){
if(n==0&&x==0) break;
ans=0;
memset(d,0,sizeof(d));
d[0][0]=1;
for(int i=0;i<n;i++){
for(int j=1;j<=6;j++)
for(int k=0;k<144;k++)
d[i+1][k+j]+=d[i][k];
}
for(int k=x;k<150;k++)
ans+=d[n][k];
num=1;
for(int i=0;i<n;i++)
num*=6;
g=gcd(ans,num);
if(ans==0) printf("0\n");
else if(ans==num) printf("1\n");
else printf("%lld/%lld\n",ans/g,num/g);
}
return 0;
}