UVA 10759 Dice Throwing
题意为抛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的更多相关文章
- 【UVA】10935 Throwing cards away I(STL队列)
题目 题目 分析 练习STL 代码 #include <bits/stdc++.h> using namespace std; int main() { int n; wh ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- hdu4405 Aeroplane chess
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 4405:Aeroplane chess(概率DP入门)
http://acm.split.hdu.edu.cn/showproblem.php?pid=4405 Aeroplane chess Problem Description Hzz loves ...
- hdu 4405Aeroplane chess(概率DP)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Aeroplane chess(HDU 4405)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 4405 Aeroplane chess(简单概率dp 求期望)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU-4405 Aeroplane chess
http://acm.hdu.edu.cn/showproblem.php?pid=4405 看了一下这个博客http://kicd.blog.163.com/blog/static/12696191 ...
- hdu 4405 Aeroplane chess (概率DP)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- Java 反射 Class对象
Java 反射 Class对象 @author ixenos 关键字:RTTI.动态绑定.动态加载.获得Class引用.泛型Class引用.newInstance的坑.JVM中的泛型类型信息 RTTI ...
- WebSocket的原理,以及和Http的关系
一.WebSocket是HTML5中的协议,支持持久连接:而Http协议不支持持久连接. 首先HTMl5指的是一系列新的API,或者说新规范,新技术.WebSocket是HTML5中新协议.新API. ...
- 前台javascript排序
<script type="text/javascript"> $(function () { $('.Sorthead-ShowUp').click(function ...
- [SOJ] connect components in undirected graph
题目描述: 输入一个简单无向图,求出图中连通块的数目 输入: 输入的第一行包含两个整数n和m,n是图的顶点数,m是边数.1<=n<=1000,0<=m<=10000. 以下m行 ...
- kettle连接Hbase中数据导入(8)
http://wiki.pentaho.com/display/BAD/Loading+Data+into+HBase 1)下载样本文件 到官网去下载
- NOIP2001-普及组复赛-第一题-数的计算
题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在 ...
- spring实现读写分离
(转自:http://www.cnblogs.com/surge/p/3582248.html) 现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数 ...
- F - 小晴天老师系列——苹果大丰收
F - 小晴天老师系列——苹果大丰收 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...
- 解决没有X11/Xlib.h 的错误
1. 解决没有X11/Xlib.h 的错误Install XLib $sudo apt-get install libx11-dev 2. 提示错误:未找到软件源 解决办法很简单,更换另一个源就行了. ...
- <meta http-equiv="X-UA-Compatible" content="IE=Edge">
1.X-UA-Compatible X-UA-Compatible是IE8的一个专有<meta>属性,它告诉IE8采用何种IE版本去渲染网页,在html的<head>标签中使用 ...