题意为抛n个骰子凑成的点数和大于或等于x的概率,刚开始用暴力枚举,虽然AC了,但时间为2.227s,然后百度了下别人的做法,交了一遍,靠,0.000s,然后看了下思路,原来是dp,在暴力的基础上记忆化搜索,把所有可能枚举出来再累加,然后自己也打了一遍,0.000sA了,做法是开一个二维数组,第一维是骰子个数,第二维是和x,然后一个只有可能是1,2,3,4,5,6,倒两个骰子时是1+1,2,3,4,5,6     2+1,2,3,4,5,6  3+...累加向上推即可

 //暴力做法,2.227s
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring> using namespace std; typedef long long ll; int n,x,dice[],prime[]={,,,,,,,,},fact[][];//n个dice,x为和,dice[i]点数为i的骰子个数
ll fz,fm; void fact_table()//fact[i] i!的质因分解表
{
memset(fact,,sizeof(fact));
for(int i=;i<=;i++)
{
int x=i;
for(int j=;x>=prime[j]&&j<;j++)
while(x%prime[j]==)
{
fact[i][j]++;
x/=prime[j];
}
}
for(int i=;i<=;i++)
{
for(int j=;j<;j++)
fact[i][j]+=fact[i-][j];
}
} void A6n()//dice[1]个1,dice[2]个2...时的种数=n!/(dice[1]!*dice[2]!*dice[3]!*dice[4]!*dice[5]!*dice[6]!)
{
ll x=;
int fn[],fnum[];
memcpy(fn,fact[n],sizeof(fn));
for(int i=;i<=;i++)//n!/dice[i]!
{
memcpy(fnum,fact[dice[i]],sizeof(fnum));
for(int j=;j<;j++)
fn[j]-=fnum[j];
}
for(int i=;i<;i++)
x*=pow(prime[i],fn[i]);
/*for(int i=1;i<=6;i++)
printf("%d ",dice[i]);
puts("");*/
fz+=x;//累加倒分子
} void C6n(int u,int n,int sum)//枚举所有可能
{
if(u==)
{
dice[u]=n;
sum+=u*n;
if(sum>=x) A6n();//和大于或等于x就加到分子中
return;
}
for(int i=;i<=n;i++)
{
dice[u]=i;
C6n(u+,n-i,sum+i*u);
}
} void slove()
{
if(*n<x)
{
puts("");
return;
}
fz=;
C6n(,n,);
int e2,e3;
e2=e3=n;//6^n=2^e2*2^e3
//printf("fz=%lld\n",fz);
while(fz%==)
{
fz>>=;
e2--;
if(!e2) break;//e2==0时要break掉,不然变成2的负数次方会wa
}
while(fz%==)
{
fz/=;
e3--;
if(!e3) break;
}
//printf("fz=%lld e2=%d e3=%d\n",fz,e2,e3);
fm=pow(,e3)*pow(,e2);
if(fz==) puts("");
else if(fm==) puts("");
else printf("%lld/%lld\n",fz,fm);
} int main()
{
//freopen("/home/user/桌面/in","r",stdin);
fact_table();
while(scanf("%d%d",&n,&x)==&&(n||x))
slove();
return ;
}
 #include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring> using namespace std; typedef long long ll; int n,x;//n个dice,x为和
ll fz,fm,fact[][]; void fact_table()
{
memset(fact,,sizeof(fact));
for(int i=;i<=;i++)
fact[][i]=;
for(int i=;i<=;i++)//fact[i][j]表示i个骰子和为j的种数
for(int j=;j<=;j++)
for(int k=i-;k<=(i-)*;k++)
fact[i][k+j]+=fact[i-][k];
/*for(int i=1;i<=24;i++)
{
printf("%d: ",i);
for(int j=i;j<i*6;j++)
printf("%lld ",fact[i][j]);
printf("\n");
}*/
}
void slove()
{
int e2=n,e3=n;
fz=;
for(int i=x;i<=;i++)
fz+=fact[n][i];
while(fz%==)
{
fz>>=;
e2--;
if(!e2) break;
}
while(fz%==)
{
fz/=;
e3--;
if(!e3) break;
}
fm=pow(,e3)*pow(,e2);
if(fz==) puts("");
else if(fm==) puts("");
else printf("%lld/%lld\n",fz,fm);
} int main()
{
//freopen("in","r",stdin);
fact_table();
while(scanf("%d%d",&n,&x)==&&(n||x)) slove();
return ;
}

UVA 10759 Dice Throwing的更多相关文章

  1. 【UVA】10935 Throwing cards away I(STL队列)

    题目 题目     分析 练习STL     代码 #include <bits/stdc++.h> using namespace std; int main() { int n; wh ...

  2. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  3. hdu4405 Aeroplane chess

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. HDU 4405:Aeroplane chess(概率DP入门)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=4405 Aeroplane chess Problem Description   Hzz loves ...

  5. hdu 4405Aeroplane chess(概率DP)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. Aeroplane chess(HDU 4405)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. hdu 4405 Aeroplane chess(简单概率dp 求期望)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. HDU-4405 Aeroplane chess

    http://acm.hdu.edu.cn/showproblem.php?pid=4405 看了一下这个博客http://kicd.blog.163.com/blog/static/12696191 ...

  9. hdu 4405 Aeroplane chess (概率DP)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. servlet 用法

    引入servlet的jar包,这个包在tomcat的lib下 新建一个servlet文件继承httpServlet,要实现里面的doGet或者doPost方法 在web.xml文件中配置 在form表 ...

  2. ckplayer 项目实战

    <div class="control-group" id="videoDiv" style="display: none;"> ...

  3. geom设置—折线图

    折线图在R中也是很常见的一种图形,相对而言也比较简单. geom_line(mapping = NULL, data = NULL, stat = "identity", posi ...

  4. 单尺度二维离散小波分解dwt2

    clc,clear all,close all; load woman; [cA,cH,cV,cD]=dwt2(X,'haar');%单尺度二维离散小波分解.分解小波函数haar figure,ims ...

  5. poj 3524 Charm Bracelet(01背包)

    Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd ...

  6. windows cmd启动heritrix

    首先下载heritrix-1.14.4.zip文件,可以在http://sourceforge.net/projects/archive-crawler/files/heritrix3/下载.下载后解 ...

  7. Brackets + Sass 学习心得

    大家知道Brackets是一个可以实时浏览html页面修改效果的工具,对于前段开发人员应该不会陌生,有了它,布局页面再也不是什么困难了, 目前为止已经更新到1.6了. 下载最新版可以到官方网: htt ...

  8. robot framework -重点记录

    1.s2l打开的driver和webdriver打开的driver不是同一个driver. rf打开的浏览器.调用的是s2l的driver,而自己的库用的是webdriver的driver,这样在rf ...

  9. 关于GVIM的配置。

    最近开始考虑从常用的 Dev-Cpp 和 Visual Studio 开发环境中转到gvim+gcc+gdb. 我一直觉得IDE很好方便,不是很明白别人这样的配置.但还是开始有意识的去尝试更换环境. ...

  10. Calendar.getInstance()获取当天指定点上的时间[转载]

    ctoday.add(Calendar.DAY_OF_MONTH, 1); 明天时间 //获得当天0点时间public static int getTimesmorning(){Calendar ca ...