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) ...
随机推荐
- CKEditor 案例
官网下载: http://ckeditor.com/download 将下载的ckeditor整个文件放入项目中 在页面中引用ckeditor.js,并用新建一个<textarea>再建一 ...
- 一、ASP.NET Routing路由(深入解析路由系统架构原理)
阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...
- python Asyncore.dispatcher 理解
1.Asyncore是python的标准库.Asyncore.dispatcher 是这个库中的一个socket的框架,为socket添加了一些通用的回调方法,比如: def listen(self, ...
- 翻扣告诉你外出旅游时实用的一些小tips
很多人出行都会带着大包小包,东西胡乱塞成一团,导致每次要用的时候都翻个遍.所以今天游游君为大家推荐几个出门旅行的小技巧. 收拾行李时,把鞋子放进浴帽里.浴帽很容易洗干净,还可以防止鞋子把干净的衣服弄脏 ...
- 在线用户管理--ESFramework 4.0 进阶(05)
无论我们采用何种通信框架来构建我们的分布式系统,在服务端进行用户管理都是非常重要的一个环节.然而用户管理是否应该隶属于通信框架了?这个并不一定,通常来说,用户管理是与具体应用紧密相关的,应该是由应用解 ...
- xampp 搭建 web mac上
1.安装 2.修改数据库密码,删除phpmyadmin ,用navicat 控制数据库 3.修改/Applications/XAMPP/xamppfiles/etc/extra/httpd-vhos ...
- erlang分布式编程模型
erlang分布式编程有两种模型 一.分布式erlang 运行在可信的网络环境中 1.rpc提供的远程过程调用 rpc:call(Node,Mode,Fun,Args) ->Result|{ba ...
- How can I create an Asynchronous function in Javascript?
哈哈:)我的codepen 的代码笔记是:http://codepen.io/shinewaker/pen/eBwPxJ --------------------------------------- ...
- HADOOP与ORACLE关联
安装Oracle和Oracle大数据连接器/OLH,尝试把HDFS中的数据文件装载到Oracle中的表 http://f.dataguru.cn/thread-460110-1-1.html 文档讲述 ...
- yaf for ubuntu安装
一.安装yaf需要的扩展 apt-get install perl-modules apt-get install libpcrecpp0 apt-get install libpcre3 libpc ...