【BZOJ4872】分手是祝愿(动态规划,数学期望)

【BZOJ4872】分手是祝愿(动态规划,数学期望)

题面

BZOJ

题解

对于一个状态,如何求解当前的最短步数?
从大到小枚举,每次把最大的没有关掉的灯关掉
暴力枚举因数关就好

假设我们知道了当前至少要关\(tot\)次
如果一个灯被动两次以上是没有任何意义的
所以,相当于,要动的灯只有\(tot\)个
其他的是没有任何意义的
所以,题面可以变为:
现在有\(tot\)个\(1\),\(n-tot\)个\(0\)
每次随机选择一个数将其异或\(1\)
求最终变为\(0\)的期望

我们现在考虑一下
设\(f[x]\)为剩下\(x\)个\(1\)的期望
并且我们知道了所有的值,
那么,我们不难推出:
\[f[x]=\frac{x}{n}(f[x-1]+1)+\frac{n-x}{n}(f[x+1]+1)\]
也就是
\[f[x]=\frac{x}{n}f[x-1]+\frac{n-x}{n}f[x+1]+1\]

同时,我们有边界:
\(f[x]=x(x\leq K)\)
\(f[n]=f[n-1]+1\)
如果考虑把\(f[n]\)带入到\(f[n-1]\)的式子中
我们可以得到只有\(f[n-1],f[n-2]\)之间的关系式
如此递推下去就可以推出\(f[K+1]\)和\(f[K]\)的关系式
这样就是常数项了
回朔带回去就可以求解
时间复杂度\(O(nlogn)\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 120000
#define MOD 100003
inline int read()
{
    RG int x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
int fpow(int a,int b)
{
    int s=1;
    while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}
    return s;
}
int tot,n,K;
int a[MAX],ans[MAX];
int inv[MAX];
int DFS(int x,int ss)
{
    if(x<=K)return ans[x]=x;
    ss=(1ll*n*inv[x]%MOD+1ll*ss*(n-x)%MOD*inv[x]%MOD)%MOD;
    return ans[x]=(DFS(x-1,ss)+ss)%MOD;
}
int main()
{
    n=read();K=read();
    for(int i=1;i<=n;++i)a[i]=read();
    for(int i=n;i;--i)
        if(a[i])
        {
            for(int j=1;j*j<=i;++j)
                if(i%j==0)
                {
                    a[j]^=1;
                    if(j*j!=i)a[i/j]^=1;
                }
            ++tot;
        }
    if(tot<=K)
    {
        for(int i=1;i<=n;++i)tot=1ll*tot*i%MOD;
        printf("%d\n",tot);
        return 0;
    }
    for(int i=1;i<=n;++i)inv[i]=fpow(i,MOD-2);
    DFS(n,1);
    for(int i=1;i<=n;++i)ans[tot]=1ll*ans[tot]*i%MOD;
    printf("%d\n",ans[tot]);
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/8419680.html

时间: 2024-08-28 10:55:15

【BZOJ4872】分手是祝愿(动态规划,数学期望)的相关文章

[bzoj4872]分手是祝愿

Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏 的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于

【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

[BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #i

BZOJ4872: [Shoi2017]分手是祝愿

4872: [Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏 的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 改变,即从亮变成灭,

bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿

http://www.lydsy.com/JudgeOnline/problem.php?id=4872 一种最优解是 从大到小灯有亮的就灭掉 最优解是唯一的,且关灯的顺序没有影响 最优解 对每个开关至多操作1次,(连带着的灯的亮灭改变不算) 设最优解 需要操作cnt次,那么就有cnt盏灯是正确的选择 设 f[i] 表示 有i种正确的选择  变为 有i-1种正确的选择 的 期望次数 那么在n盏灯中,有i盏灯操作1次 就可以 减少一次正确选择 有n-i盏灯是错误的选择,选了它还要把它还原,还原它也

数学1——概率与数学期望

1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量的期望值是试验中每一次可能出现的结果的概率乘以其结果的总和. 这是什么意思呢?假如我们来玩一个游戏,一共52张牌,其中有4个A.我们1元钱赌一把,如果你抽中了A,那么我给你10元钱,否则你的1元钱就输给我了.在这个游戏中,抽中的概率是$\frac{1}{13} ( \frac{4}{52} ) $,结果是赢10元钱:抽不中概率是$\frac{12}{13}$,结果是亏1元钱.那么你赢的概率,也就是期望值是$-

概率与数学期望

这个数学知识点很容易和其他有关的内容结合起来考.其中有几个性质值得我们注意. 1.1 概率定义 我们经常会做一些随机性的实验.实验往往会给出不同的结果,我们称之为样本点.我们把所有样本点构成的集合叫做样本空间,记为\(\Omega\). 在这个样本空间里,我们称一个随机事件是样本空间\(\Omega\)的子集.这里算是扫清了过去的知识盲区:随机事件是一个集合,而不是真的是一个概念上的事件. 对于一个随机事件\(A\),我们可以定义一个数来衡量它在样本空间的"比重",那就是概率.随机事件

数学期望

数学期望又称均值(加权均值),例如 甲8环,9环,10环的概率分别为0.1,0.8,0.1,即权重,则加权均值为8*0.1+9*0.8+10*0.1=9:同理乙的加权均值为8.95 则甲的平均成绩优于乙 对于离散型随机变量 连续型随机变量

poj3682:数学期望,O(1)做法附推导过程

这几天一直在磨蹭这题..第一个答案很容易,但在第二个答案我无法算出来了,于是只好求助于Zayin.Zayin又求助于我们年级里面的一个研究生数学老师..而现在终于算出来了,我看了看,自己也推出来几次了,先看题:) King Arthur's Birthday Celebration Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2921 Accepted: 926 Description King Arthur is an

HDUBoard Game Dice (数学期望)

推出的公式是M^x*x/N,大概意思是M^x*x这些种可能后一定会找出一个裁判,在除以N为数学期望. 可能和数学公式还有关系. #include<stdio.h> #include<math.h> __int64 gcd(__int64 a,__int64 b){ return b == 0 ? a : gcd(b, a%b); } int main() { __int64 i,j,n,m,t,x,a,b,temp,sum; scanf("%I64d",&