hdu4935 Prime Tree(2014多校联合第七场)
首先这是一道dp题,对题意的把握和对状态的处理是解题关键。
题目给出的范围是n在1到1e11之间,由于在裂变过称中左儿子总是父亲节点的一个非平凡约数,容易看出裂变过程只与
素数幂有关,并且显然有素数不超过11个,幂指数不超过40,实际上可以用一个大小为11的数组来等价地表示状态,状态
与其内元素顺序无关,因此可以排序,压缩后的状态不超过3000个(准确地说是2957个,通过一个简单的dfs即可统计出此结果)。
以上解决了题目的规模问题。
这道题目我开始因为理解错题意wa了几次,不能通过统计儿子节点的期望高度的平均值再加1得到以父节点为根的数的期望高度,因为两颗子树
的高度在概率上对根树的影响不是相互独立的。
可以设dp(i, j)为以状态i为根深度为j的概率:
那么显然有dp(i, j) = sigma(dp(k, j - 1) * sigma(i / k, t) + sigma(k, t) * dp(i / k, j - 1) + dp(k, j - 1) * dp(i / k, j -1)) / (N - 2)
其中k | i, 且 k ≠ 1,k≠ i, t < j - 1。
以状态i为根的树的期望高度:exp(i) = sigma(j * dp(i, j)), 0 < j < 40.
因此状态转移可以通过枚举左儿子得到,整体复杂度O(3000 * 3000 * 40)。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#pragma comment(linker, "/STACK:102400000,102400000")
#define lson (u << 1)
#define rson (u << 1 | 1)
#define cls(i, j) memset(i, j, sizeof i)
using namespace std;
typedef __int64 ll;
const double eps = 1e-;
const double pi = acos(-1.0);
const int maxn = 1e5 + ;
const int maxm = ;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3fffffffffffffff;
const ll mod = 1e9 + ; int debug = ;
map<ll, int> mapi;
int buf[], k1;
ll S = (ll)1e11;
double dp[][]; int a[] = {, , , , , , , , , , };
bool cmp(int a, int b) { return a > b; }
int prime[maxn], k;
bool vis[]; ll Hash(int *t){
ll tem = , ans = ;
for(int i = ; i < ; i++){
ans += tem * t[i];
tem *= ;
}
return ans;
} int stack[], k2;
ll states[];
int ks;
int table[][]; void dfs(ll num, int limit, int next){
if(next){
memcpy(buf, stack, sizeof buf);
sort(buf, buf + , cmp);
ll hash_value = Hash(buf);
states[ks++] = hash_value;
memcpy(table[ks - ], buf, sizeof buf);
mapi[hash_value] = ks - ;
}
if(next > ) return;
for(int i = ; i <= limit; i++){
num *= a[next];
if(num > S) break;
stack[k2++] = i;
dfs(num, i, next + );
stack[--k2] = ;
}
} void shaffix(){
bool vis[ + ];
int mid = (int)5e5 + ;
cls(vis, );
for(int i = ; i < mid; i++){
if(vis[i]) continue;
prime[k++] = i;
for(ll j = (ll)i * ; j < mid; j += i) vis[j] = ;
}
} void cal(int id); void dfs1(int id, int next){
if(next > ){
int buf1[], buf2[];
memcpy(buf1, stack, sizeof stack);
for(int i = ; i < ; i++) buf2[i] = table[id][i] - buf1[i];
sort(buf1, buf1 + , cmp);
sort(buf2, buf2 + , cmp);
if(!buf1[] || !buf2[]) return;
ll hash_value1 = Hash(buf1), hash_value2 = Hash(buf2);
int id1 = mapi[hash_value1], id2 = mapi[hash_value2];
cal(id1), cal(id2);
double prefix_left = , prefix_right = ;
for(int i = ; i < ; i++){
dp[id][i + ] += dp[id1][i] * prefix_right +
prefix_left * dp[id2][i] + dp[id1][i] * dp[id2][i];
prefix_left += dp[id1][i], prefix_right += dp[id2][i];
}
return;
}
for(int i = ; i <= table[id][next]; i++){
stack[k2++] = i;
dfs1(id, next + );
stack[--k2] = ;
}
} void cal(int id){
if(vis[id]) return;
k2 = ;
dfs1(id, );
int sum = ;
for(int i = ; i < ; i++) sum *= + table[id][i];
sum -= ;
for(int i = ; i < ; i++) dp[id][i] /= sum;
vis[id] = ;
//printf("%d+\n", id);
} void init(){
shaffix();
cls(vis, );
vis[] = ;
mapi.clear();
//0...10 < 10^11
cls(stack, );
ks = k2 = ;
dfs(, , );
cls(dp, );
dp[][] = ;
for(int i = ; i < ks; i++) cal(i);
} double solve(ll num){
cls(buf, );
k1 = ;
int mid = (int)sqrt((double)num);
for(int i = ; i < k && prime[i] <= mid; i++){
if(num % prime[i]) continue;
while(num % prime[i] == ) ++buf[k1], num /= prime[i];
mid = (int)sqrt((double)num);
k1++;
}
if(num != ) buf[k1++] = ;
sort(buf, buf + , cmp);
ll hash_value = Hash(buf);
double ans = ;
int id = mapi[hash_value];
for(int i = ; i < ; i++) ans += dp[id][i] * i;
return ans;
} int main(){
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int T, kase = ;
init();
scanf("%d", &T);
ll n;
while(T--){
scanf("%I64d", &n);
double ans = solve(n);
printf("Case #%d: %.6f\n", ++kase, ans);
}
return ;
}
hdu4935 Prime Tree(2014多校联合第七场)的更多相关文章
- hdu4940 Destroy Transportation system(2014多校联合第七场)
题意很容易转化到这样的问题:在一个强连通的有向图D中是否存在这样的集合划分S + T = D,从S到T集合的边权大于从T到S集合的边权. 即D(i, j) > B(j, i) + D(j, i ...
- HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu5379||2015多校联合第7场1011 树形统计
pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little sun is ...
- 2014 多校联合训练赛6 Fighting the Landlords
本场比赛的三个水题之一,题意是两个玩家每人都持有一手牌,问第一个玩家是否有一种出牌方法使得在第一回和对方无牌可出.直接模拟即可,注意一次出完的情况,一开始没主意,wa了一发. #include< ...
- hdu 4869 Turn the pokers (2014多校联合第一场 I)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4870 Rating (2014 多校联合第一场 J)(概率)
题意: 一个人有两个TC的账号,一开始两个账号rating都是0,然后每次它会选择里面rating较小的一个账号去打比赛,每次比赛有p的概率+1分,有1-p的概率-2分,当然如果本身是<=2分的 ...
- HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去2 ...
- HDU 4869 Turn the pokers (2014 多校联合第一场 I)
HDOJ--4869--Turn the pokers[组合数学+快速幂] 题意:有m张扑克,开始时全部正面朝下,你可以翻n次牌,每次可以翻xi张,翻拍规则就是正面朝下变背面朝下,反之亦然,问经过n次 ...
- HDU 4865 Peter's Hobby(2014 多校联合第一场 E)(概率dp)
题意:已知昨天天气与今天天气状况的概率关系(wePro),和今天天气状态和叶子湿度的概率关系(lePro)第一天为sunny 概率为 0.63,cloudy 概率 0.17,rainny 概率 0.2 ...
随机推荐
- Servlet加载器的实验
今天,看了张孝祥老师的类加载器的一个高级实验分析的教程,有点受益匪浅. 新建servlet工程,在Servlet类中 package com.sinosoft.servelt; import java ...
- [phonegap]安装phonegap
下载nodejs,安装,单nodejs4.0.0 x64编译时,还需要python2.6 or python2.7: 参考怎么安装python2.7: http://jingya ...
- 自动备份sqlexpress 数据库脚本
Create PROCEDURE [dbo].[usp_BackupDatabase] @databaseName sysname,@backupPath nvarchar(255), @backup ...
- CSS3 filter:drop-shadow滤镜与box-shadow区别应用 抄的
CSS3 filter:drop-shadow滤镜与box-shadow区别应用 这篇文章发布于 2016年05月18日,星期三,01:07,归类于 css相关. 阅读 5777 次, 今日 12 次 ...
- 夺命雷公狗---DEDECMS----16dedecms取出首页今日更新
我们这次就要来取出我们的电影和电视剧以及综艺节目: 我们首先在我们受页面的模版文件中获取电影和电视剧的标签: 我们发现这里有一大堆,我只留一个即可: 然后我们到后台更新下首页的模版,看下是否只有一个模 ...
- 针对Android 模拟器启动慢的问题
Android 模拟器一直以运行速度慢著称,可以使用intel HAXM技术为Andorid模拟器加速.使模拟器运行度媲美真机, 彻底解决模拟器运行慢的问题. 1. Intel HAXM 是什么 In ...
- MessageDigest
转: 我们知道,编程中数据的传输,保存,为了考虑安全性的问题,需要将数据进行加密.我们拿数据库做例子.如果一个用户注册系统的数据库,没有对用户的信息进 行保存,如,我去页面注册,输入"Vic ...
- SQL 基础语法(创建表空间、用户、并授予权限、数据的增删改查) --(学习笔记)[转]
--创建表空间 名:lyayzh_test create tablespace lyayzh_test --创建表数据文件 名:lyayzh_test_data.dbf 必须以dbf为后缀 dataf ...
- webservice 错误::无法加载协定为的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
转自网络 错误::无法加载协定为“ServiceReference1.INetbankUpdateService”的终结点配置部分,因为找到了该协定的多个终结点配置.请按名称指示首选的终结点配置部分. ...
- SpringMVC @RequestBody接收Json对象字符串 demo
springmvc 的这个 @RequestBody 用得比较少,今天看了一下,还是很方便. @RequestBody 接收类似 [{name: "test"}, {name: & ...