Bzoj3652 大新闻
2024-10-20 15:46:06
Time Limit: 10 Sec Memory Limit: 512 MBSec Special Judge
Submit: 215 Solved: 112
Description
Input
Output
Sample Input
3 0.5
Sample Output
2.000000
HINT
1<=N<=10^18
Source
加密和不加密各自是独立问题
后者是炒鸡麻烦的数位DP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int mxn=;
LL n;
LL b[];
double p;
int len;
double pw(){//加密
double res=;
for(int i=;i<len;i++){
double L=(n/(1LL<<(i+)))*(double)(1LL<<i);
//高位取遍所有情况,当前位为0,低位无限制
double R=(max(0LL,n%(1LL<<(i+))-(1LL<<i)));
//高位为极限,当前位为1,低位不超限
L=(L+R)/n;
res+=L*(-L)**(1LL<<i);
//取对立情况使得该位异或和为1的期望*贡献 x,y交换是另一种情况,所以*2
}
return res;
}
double f[];
double npw(){//未加密
n--;//右侧开区间
double res=;
if(n&)f[]=;else f[]=;
f[]/=(n+);
LL m=n;
int i,j;
for(i=;i<len-;i++){
if((n>>i)&)f[i]=f[i-]+(double)b[i]/(n+)*b[i]*+(double)(b[i]-)*1.0/(n+)*b[i];
else f[i]=f[i-]*+(b[i])/(double)(n+)*(b[i]);
}
for(int i=len-;i>=;i--){
if((n>>i)&){//x可以取1
if((m>>i)&){//y可以取1
res+=(b[i+]-)*(double)(m+-(b[i]))/(n+);
m=(b[i])-;
}
res+=b[i]*(double)(m+)/(n+);
}
else{
if((m>>i)&){
res+=(b[i])*(double)(m+-(b[i]))/(n+);
m^=(b[i]);
res+=i->=?f[i-]:;
}
}
}
n++;
return res;
}
int main(){
int i,j;
scanf("%lld%lf",&n,&p);
len=;
while((1LL<<len)<=n)++len;
for(i=;i<=len;i++)b[i]=1LL<<i;
printf("%.8f\n",npw()*p+pw()*(-p));
return ;
}
最新文章
- kd树和knn算法的c语言实现
- yii asset 初步
- maven全局配置文件settings.xml详解
- php 错误
- 怎么利用javascript删除字符串中的最后一个字符呢?
- ASP.NET 成功执行Update 的 ExecuteNonQuery() 返回值大于0,但是查看数据库却没有改变
- ASP.Net将图片以二进制方式存入数据库,并读取
- Inno Setup 网页显示插件 webctrl (V2.1 版本)
- HDU1372:Knight Moves(BFS)
- 如何通过织云 Lite 愉快地玩转 TSW
- 关于JavaScript(脚本语言)
- Powershell远程执行命令
- [转帖]HPE的软件部分到底是谁的?
- Java设计模式从精通到入门五 抽象工厂方法模式
- 使用Axure RP原型设计实践05,了解公式
- Total Commander如何设置自定义快捷键在当前目录打开ConEmu
- jenkins的时间与服务器的时间不一致
- Python数据分析工具库-Numpy 数组支持库(一)
- C# 关于JArray和JObject封装JSON对象
- 20155229 2016-2017-2《Java程序设计》课程总结