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