思路:首先考虑t=1的情况,t等于1,那么所有位置的颜色相同,我们不用考虑概率的问题,那么,k+d*x在模d下都相等,我们考虑预处理一个数组s[i][j],代表d为i,起始位置为j的等差数列的和,这个可以证明,当模小于等于sqrt(n)的时候可以完美解决,时间复杂度为N^1.5,对于d大于sqrt(n)的情况,只需要暴力枚举就可以了。

再考虑t>=2的情况,我们选的颜色一定是颜色数最少的那个,颜色数最少的颜色的期望绝对是最小的,然后,我们分k的左边和k的右边进行计算,我们这里称呼k+d*x的位置,叫做关键位置,假设p[i]为i到k这一段上所有的关键位置全部都是同一个颜色的概率,那么转移,就是p[i+k]=p[i]*(x)/(n-1-x),x为最少的颜色个数。我们可以发现,x<(n-1)/2,p[i]是随指数级衰减的,那么我们只需要枚举一小段,当p[i]<eps时,那么它对答案就几乎没有影响了。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
int block,n,m;
int s[][],a[];
const double eps=1e-;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void init(){
n=read();m=read();
for (int i=;i<=n;i++) a[i]=read();
block=ceil(sqrt(n))+0.1;
for (int i=;i<=block;i++)
for (int j=;j<=i;j++)
for (int k=j;k<=n;k+=i)
s[i][j]+=a[k];
}
void modify(int x,int y){
int T=y-a[x];
for (int i=;i<=block;i++)
s[i][(x-)%i+]+=T;
a[x]=y;
}
double deal(int k,int d){
if (d<=block) return s[d][(k-)%d+];
double res=;
for (int i=(k-)%d+;i<=n;i+=d)
res+=(double)a[i];
return res;
}
void solve(){
while (m--){
int opt=read();
if (opt==){
int x=read(),y=read();
modify(x,y);continue;
}
int num=0x7fffffff,t,k,d;
t=read();k=read();d=read();for (int i=;i<=t;i++){int l=read();num=std::min(num,l);}
if (t==) {printf("%.4f\n",deal(k,d));continue;}
double ans=(double)a[k],p=;
int N=num;
for (int i=k+d,Num=n-;i<=n&&num>;i+=d,Num--,num--){
p=p*num/Num;ans+=p*a[i];
if (p<eps&&n>=) break;
}
num=N;p=;
for (int i=k-d,Num=n-;i>=&&num>;i-=d,Num--,num--){
p=p*num/Num;ans+=p*a[i];
if (p<eps&&n>=) break;
}
printf("%.4f\n",ans);
}
}
int main(){
init();
solve();
}

最新文章

  1. 【USACO 3.1】Humble Numbers(给定质因子组成的第n大的数)
  2. UIWindows&amp;nbsp;使用注意
  3. aws在线技术峰会笔记-基于AWS的Devops最佳实践
  4. CentOS 6.3 NFS的安装配置、启动及mount挂载方法
  5. [Java] 将标准字符流写入到文件中(通过控制台写一个html程序,并保存)
  6. JDBC学习笔记(8)——数据库连接池(dbcp&amp;C3P0)
  7. 24种设计模式--命令模式【Command Pattern】
  8. go语言的安装和配置,以及包引用
  9. OpenCV初探
  10. 201521123062《Java程序设计》第11周学习总结
  11. 【C++】二叉树的构建、前序遍历、中序遍历
  12. 《深入浅出nodejs》读书笔记(1)
  13. python中get pass用法
  14. mac安装mysql8.0的错误
  15. PHP函数之array_chunk
  16. 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
  17. Python之路【第二篇】: 列表、元组、字符串、字典、集合
  18. Angular material mat-icon 资源参考_Social
  19. C++11新特性之字节对齐、多参数模版、placement new
  20. Wannafly summer camp Day2I(思维)

热门文章

  1. ubuntu vim YCM
  2. jQuery.trim(str)
  3. 快速排序(Quick Sort)
  4. js 写table 函数
  5. LinQ 语法基础
  6. python实现二叉树和它的七种遍历
  7. Android开发中用到的框架、库介绍
  8. linux cache swap 以及 虚拟内存等
  9. Entity Framework数据库迁移
  10. UIView的一些常用属性和方法