题目大意

有\(n\)(\(n\leq 10^9\))个数:\(1,2,...,n\),每次操作是随机取一个没被删除的数\(x\),并删去\(x,x^2,x^3,...\)。

求期望几次删完所有数。

题解

可以把问题转换成:有\(n\)个数,每次操作随机取一个数\(x\),若\(x\)未被标记则标记\(x,x^2,x^3,...\)并删去\(x\),反之则删去\(x\),求期望删多少个未被标记的数。

发现一个数\(x\)被计入答案的充要条件是\(\forall y\in\{1,2,3,...,n\}\)满足\(\exists k,y^k=x\),删除序列中\(y\)在\(x\)之后。

记\(y\)的个数为\(p\),问题变成有\(p+1\)个数的排列,指定的数在第一个的概率。这个问题的答案是\(\frac{1}{p+1}\)。

也就是说,设\(p_i\)表示当\(x=i\)时\(y\)的个数,那么原问题的答案是\(\sum\limits_{i=1}^n \frac{1}{p_i+1}\)。

这个式子看上去只能\(\Theta(n)\)地求。

发现\([2,n]\)中有\(\lfloor \sqrt n \rfloor-1\)个平方数,三次根号\(n\)下取整减1个立方数……,\(p_i\neq 0\)的数的个数很少,这些数可以暴力求。

\(p_i=0\)的数的\(\frac{1}{p_i+1}=1\),可以直接求。

代码

#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define view(u,k) for(int k=fir[u];~k;k=nxt[k])
#define LL long long
#define maxn 1000007
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar('\n');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
return;
}
int n,t,mx=1e9,pos[maxn],cnt;
map<int,int>mp;
LL mul(LL x,int y){LL res=1;while(y){if(y&1)res*=x;x*=x,y>>=1;}return res;}
int main()
{
rep(i,2,30)
{
LL now=mul(2,i);int j;
for(j=2;now<=mx;)
{
mp[now]++;
if(mp[now]==1)pos[++cnt]=now;
j++;now=mul(j,i);
}
}
t=read();
while(t--)
{
n=read();
double ans=0.0;int num=0;
rep(i,1,cnt)if(pos[i]<=n)num++,ans+=1.0/((double)(mp[pos[i]]+1));
ans+=(double)(n-num);
printf("%.8lf\n",ans);
}
return 0;
}

一些感想

伟大的ysf口胡的

最新文章

  1. Java 用LinkdeList实现52张扑克牌
  2. 浏览器请求页面时Etag和cache的区别
  3. BestCoder Round #89 Fxx and string
  4. haproxy 新手上路
  5. MSP430学习笔记:UART
  6. 2016.02.17 JS DOM编程艺术 第四五六章
  7. 基于ace后台管理系统模板--CMS(Thinkphp框架)的筹划
  8. 如何检查机器是否因为装了Windows更新而需要重新启动
  9. html5 实现手机端相册浏览功能
  10. Linux on ASUS N550JK4700
  11. 16Khz音频定时触发采样DMA存储过程
  12. 关于EF中直接执行sql语句的参数化问题
  13. 如何使用MVP+Dagger2+RxJava+Retrofit开发(1)
  14. ExtJs 思维导图
  15. 关于select的一个错误---属性选择器
  16. 【iOS】OC-UTC日期字符串格式化
  17. Python练习七
  18. sfc /scannow命令如何能用虚拟光驱完成修复?(xp下的办法)
  19. 20175312 2018-2019-2 《Java程序设计》第2周学习总结
  20. Windows8下安装ubuntu

热门文章

  1. 去除ZERO WIDTH SPACE 零宽字符: 看不见却占位置的字符
  2. Nginx-HTTP之静态网页访问流程分析一
  3. activemq备忘
  4. cucumber+testng
  5. [java]取当前平台默认字符集,取字符串长度
  6. centos7 开启80端口
  7. DisplayUtils
  8. js-xlsx
  9. Jedis的Publish/Subscribe功能的使用
  10. Python--多任务(多进程,多线程,协程)