HDU6037 Expectation Division 期望、高维前缀和
设\(f_x\)表示答案,那么\(f_x = \frac{\sum\limits_{d \mid x} f_d}{\sigma_0(x)} + 1 = \frac{\sigma_0(x) + \sum\limits_{d \mid x , d \neq x} f_d}{\sigma_0(x) - 1}\)
不难发现\(f_x\)只和\(x\)每个质因子出现次数构成的可重集合相关,所以考虑将所有质因子出现次数相同的放在一起考虑,经过搜索可以得到总的可重集的个数为\(172513\)种。
现在相当于设\(f_S\)表示质因子可重集合为\(S\)时的答案,那么仍然有\(f_S = \frac{\sigma_0(x) + \sum\limits_{T \varsubsetneqq S} f_T}{\sigma_0(x) - 1}\),其中\(x\)表示任意一个满足质因子可重集合为\(S\)的数,当然\(\sigma_0(x)\)也只和\(S\)有关,这里这么写只是为了好写
我们需要快速求出\(\sum\limits_{T \varsubsetneqq S} f_T\)。不难发现这是一个高维前缀和的形式,但是并不能够先枚举维度、再枚举位置,因为计算是在线的,每一次计算必须要把之前的子集算出来,所以当前计算就一定要把当前的值算出来。我们考虑反过来,我们相当于已经枚举了一个位置,那么设\(g_{S,j}\)表示对于\(S\),对于所有满足:\(S\)和\(T\)中最大的\(j-1\)个元素相同,其余元素排序之后对应位置\(S\)中的元素大于等于\(T\)中元素的所有\(T\)的\(f_T\)的和。转移先枚举第一个满足\(S\)中元素大于\(T\)中元素的位置进行贡献,然后计算一下后缀和。那么\(\sum\limits_{T \varsubsetneqq S} f_T = g_{S,1}\)。
#include<bits/stdc++.h>
//this code is written by Itst
using namespace std;
#define int __int128
int read(){
int a = 0; char c = getchar();
while(!isdigit(c) && c != EOF) c = getchar();
if(c == EOF) exit(0);
while(isdigit(c)){
a = a * 10 + c - 48; c = getchar();
}
return a;
}
const int prm[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79};
int cnt; double ans[300003][20];
map < int , int > Hash;
int poww(int a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a;
a = a * a; b >>= 1;
}
return times;
}
int arr[30];
int find(){
int tms = 1;
for(int i = 1 ; arr[i] ; ++i)
tms = tms * poww(prm[i - 1] , arr[i]);
return tms;
}
void dfs(int now , int id , int pre , int ys){
if(now != 1){
Hash[now] = ++cnt;
int p = 1;
for(int i = 1 ; i < id ; ++i)
if(arr[i] > arr[i + 1]){
--arr[i]; int id = Hash[find()];
for(int j = p ; j <= i ; ++j) ans[cnt][j] = ans[id][j];
p = i + 1; ++arr[i];
}
for(int i = id - 2 ; i > 0 ; --i)
ans[cnt][i] = ans[cnt][i] + ans[cnt][i + 1];
ans[cnt][0] = (ans[cnt][1] + ys) / (ys - 1);
}
for(int i = 1 ; i <= id ; ++i) ans[cnt][i] += ans[cnt][0];
for(int j = 1 ; now * prm[id - 1] <= 1e24 && j <= pre ; ++j){
arr[id] = j;
dfs(now *= prm[id - 1] , id + 1 , j , ys * (j + 1));
}
arr[id] = 0;
}
bool cmp(int a , int b){return a > b;}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
dfs(1 , 1 , 1e9 , 1);
int N , M , Case = 0;
while(N = read()){
M = read();
for(int i = 1 ; i <= M ; ++i){
int P = read() , cnt = 0;
while(N % P == 0){N /= P; ++cnt;}
arr[i] = cnt;
}
sort(arr + 1 , arr + M + 1 , cmp); arr[M + 1] = 0;
printf("Case #%d: %.10lf\n" , (signed)(++Case) , ans[Hash[find()]][0]);
}
return 0;
}
HDU6037 Expectation Division 期望、高维前缀和的更多相关文章
- 【HDU6037】Expectation Division(动态规划,搜索)
[HDU6037]Expectation Division(动态规划,搜索) 题面 Vjudge 你有一个数\(n\),\(n\le 10^{24}\),为了方便会告诉你\(n\)分解之后有\(m\) ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- Luogu3175 HAOI2015 按位或 min-max容斥、高维前缀和、期望
传送门 套路题 看到\(n \leq 20\),又看到我们求的是最后出现的位置出现的时间的期望,也就是集合中最大值的期望,考虑min-max容斥. 由\(E(max(S)) = \sum\limits ...
- BZOJ4036:按位或 (min_max容斥&高维前缀和)
Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作.选择数字i的概率是p[i].保证0&l ...
- 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)
点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...
- [luogu 3175] [HAOI2015]按位或(min-max容斥+高维前缀和)
[luogu 3175] [HAOI2015]按位或 题面 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行按位或运算.问期望多少秒后,你手上的数字变成2^n ...
- BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)
题目链接 \(Description\) \(Solution\) 首先处理\(a_i\)的前缀异或和\(s_i\).那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\( ...
- HDU.5765.Bonds(DP 高维前缀和)
题目链接 \(Description\) 给定一张\(n\)个点\(m\)条边的无向图.定义割集\(E\)为去掉\(E\)后使得图不连通的边集.定义一个bond为一个极小割集(即bond中边的任意一个 ...
- SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)
题目链接 \(Description\) 给定长为\(n\)的数组\(c_i\)和\(m\),求长为\(n\)的序列\(a_i\)个数,满足:\(c_i\not\mid a_i,\quad a_i\& ...
随机推荐
- 洛谷 P1536 村村通
目录 题目 思路 \(Code\) 题目 P1536 村村通 思路 并查集,一开始连通快的数量为\(n\),输入\(m\)条边时如果该边起点和终点不在同一联通块内就合并并让联通块数量减一,最后输出联通 ...
- CMD下文件操作
CMD下常用文件操作指令 1.输入盘符 如C: 然后回车,相当于进了C盘(c盘一般进的是桌面目录) 2.输入 cd 目录名 然后回车(目录名是c盘中的一级目录名,也可为c盘中的目录路径).如cd mm ...
- (15)Go错误处理
1.erro(一般错误) package main import ( "errors" "fmt" ) func div(a, b int) (res int) ...
- Dense Semantic Labeling with Atrous Spatial Pyramid Pooling and Decoder for High-Resolution Remote Sensing Imagery(高分辨率语义分割)
对 Potsdam and Vaihingen 公开数据集进行处理,得到了SOTA的结果,超越DeepLab_v3+,提出的网络结构如下:结合了ASPP和FCN,UNet
- 【POJ2965】The Pilots Brothers' refrigerator
题目传送门 本题知识点:深度优先搜索 + 暴力枚举 + 回溯 + 栈 如果对以上知识点还不熟悉的同学建议先做做 POJ1753 (本题是1753的提高版)(附 POJ1753博客) 以下默认您已ACP ...
- [总结] MSF攻击数据库服务
0x01 攻击Mysql服务 1.1 目标探测 auxiliary/scanner/mysql/mysql_version 常用于内网中的批量mysql主机发现: 1.2 爆破登录 auxiliary ...
- 微信小程序之使用wx:for遍历循环
效果图如下: 实现代码如下:type.js: // pages/type/type.js Page({ /** * 页面的初始数据 */ data: { types: "" }, ...
- Windows安装Python3 curses模块
目录 0.前提 1.pip install wheel 2.下载.whl文件 3.pip install 它 参考 0.前提 确定你已经配置好了Python相关环境,可以正常在命令行使用pip安装. ...
- python使用ldap3进行接口调用
把自己使用到的ldap调用的代码分享出来,希望大家可以参考 #!/usr/bin/python # -*- coding: utf-8 -*- """ @Time : 2 ...
- TOMCAT 可以稳定支持的最大并发用户数
微软系统平台上 TOMCAT性能调优后可以稳定支持的最大并发用户数量在300人服务器配置: 单硬盘,SATA 8MB缓存测试服务器和loadrunner运行服务器位于同一网段 100MB网络( ...