题面传送门

首先我们需注意到这样一个性质:那就是对于任何一种状态,将其变为全 \(0\) 所用的最小步数的方案是唯一的——考虑编号为 \(n\) 的灯,显然如果它原本是暗着的就不用管它了,如果它是亮着的那就只能通过拉它自己使其变暗,这需要 \(1\) 步操作,并会使所有 \(i\mid n\) 的灯 \(i\) 的状态取反;接下来依次考虑编号 \(n-1\),如果它在处理完编号为 \(n\) 的灯后还是亮着的,那也只能通过拉它本身的开关将其关掉;接下来再考虑编号为 \(n-1,n-2,\dots\) 的灯,以此类推。

其次我们还可以注意到,记 \(F(a[1...n])\) 表示对于序列 \(a_1,a_2,\dots a_n\) 需要按哪几个灯才能关掉所有灯,如果我们按下了一盏编号 \(\notin F(a[1...n])\) 的灯,那么我们还需要 \(|F(a[1...n])|+1\) 次操作才能才能关掉所有灯;同理如果我们按下了一盏编号 \(\in F(a[1...n])\) 的灯,那么我们还需要 \(|F(a[1...n])|-1\) 次操作才能才能关掉所有灯。

上述性质告诉我们,\(F(a[1...n])\) 具体是什么并不重要,我们只用关心其大小即可。这样就可以 DP 了。设 \(dp_i\) 表示从 \(|F(a[1...n])|=i\) 的状态变成 \(|F(a[1...n])|=i-1\) 的状态期望需要多少步。那么有状态转移方程 \(dp_i=\dfrac{n-i}{n}(dp_{i+1}+dp_i+1)+\dfrac{i}{n}\),稍微变个形即可得到 \(dp_i=\dfrac{n+(n-i)\times dp_{i+1}}{i}\),线性递推求一下即可,最终答案即为 \(k+dp_{k+1}+dp_{k+2}+\dots+dp_x\),其中 \(x\) 为初始的 \(|F(a[1...n])|\)。最前面那个 \(k\) 很容易被忽略,一定要格外注意。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define fill0(a) memset(a,0,sizeof(a))
  6. #define fill1(a) memset(a,-1,sizeof(a))
  7. #define fillbig(a) memset(a,63,sizeof(a))
  8. #define pb push_back
  9. #define ppb pop_back
  10. #define mp make_pair
  11. template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
  12. template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
  13. typedef pair<int,int> pii;
  14. typedef long long ll;
  15. typedef unsigned int u32;
  16. typedef unsigned long long u64;
  17. namespace fastio{
  18. #define FILE_SIZE 1<<23
  19. char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
  20. inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
  21. inline void putc(char x){(*p3++=x);}
  22. template<typename T> void read(T &x){
  23. x=0;char c=getchar();T neg=0;
  24. while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
  25. while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
  26. if(neg) x=(~x)+1;
  27. }
  28. template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
  29. template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
  30. void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
  31. }
  32. const int MAXN=1e5;
  33. const int MOD=1e5+3;
  34. int n,k,a[MAXN+5],inv[MAXN+5],dp[MAXN+5],cnt=0;
  35. int main(){
  36. scanf("%d%d",&n,&k);
  37. for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  38. for(int i=n;i;i--) if(a[i]){
  39. cnt++;
  40. for(int j=1;j*j<=i;j++) if(i%j==0){
  41. a[j]^=1;if(j!=i/j) a[i/j]^=1;
  42. }
  43. }
  44. inv[1]=1;
  45. for(int i=2;i<=n;i++) inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
  46. for(int i=n;i;i--) dp[i]=1ll*(n+1ll*dp[i+1]*(n-i)%MOD)*inv[i]%MOD;
  47. int ans=0;
  48. if(cnt>=k){
  49. for(int i=cnt;i>k;i--) ans=(ans+dp[i])%MOD;
  50. ans=(ans+k)%MOD;
  51. } else ans=cnt;
  52. for(int i=1;i<=n;i++) ans=1ll*ans*i%MOD;printf("%d\n",ans);
  53. return 0;
  54. }

洛谷 P3750 - [六省联考2017]分手是祝愿(期望 dp)的更多相关文章

  1. 洛谷P3750 [六省联考2017]分手是祝愿(期望dp)

    传送门 嗯……概率期望这东西太神了…… 先考虑一下最佳方案,肯定是从大到小亮的就灭(这个仔细想一想应该就能发现) 那么直接一遍枚举就能$O(nlogn)$把这个东西给搞出来 然后考虑期望dp,设$f[ ...

  2. 洛谷 P3750 [六省联考2017]分手是祝愿

    传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include&l ...

  3. [bzoj4872] [洛谷P3750] [六省联考2017] 分手是祝愿

    Description Zeit und Raum trennen dich und mich. 时空将你我分开. \(B\) 君在玩一个游戏,这个游戏由 \(n\) 个灯和 \(n\) 个开关组成, ...

  4. P3750 [六省联考2017]分手是祝愿 期望DP

    \(\color{#0066ff}{ 题目描述 }\) Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 \(n\) 个灯和 ...

  5. [BZOJ4872][六省联考2017]分手是祝愿(期望DP)

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 516  Solved: 342[Submit][Statu ...

  6. [六省联考2017]分手是祝愿 期望DP

    表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...

  7. [六省联考2017]分手是祝愿——期望DP

    原题戳这里 首先可以确定的是最优策略一定是从大到小开始,遇到亮的就关掉,因此我们可以\(O(nlogn)\)的预处理出初始局面需要的最小操作次数\(tot\). 然后容(hen)易(nan)发现即使加 ...

  8. BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description ...

  9. luogu P3750 [六省联考2017]分手是祝愿

    luogu loj 可以发现在最优策略中,每种操作最多只会做一次,并且操作的先后顺序并不会影响答案,所以考虑从后往前扫,碰到一个\(1\)就对这个位置\(i\)进行操作,这样的操作一定是最优策略.记最 ...

随机推荐

  1. 《python编程:从入门到实践》课后习题及答案

    转载: <Python编程:从入门到实践>课后习题及答案-码农之家 (xz577.com) <Python编程:从入门到实践>课后习题及答案 - 信德维拉 - 博客园 (cnb ...

  2. FastAPI 学习之路(五十四)startup 和 shutdown

    我们在实际的开发中呢,总会遇到这样的场景,我们想在启动或者终止的时候,做一些事情,那么应该如何实现呢,其实也是很简单.fastapi提供了这样的操作. 那么我们看下具体是怎么实现的呢 app = Fa ...

  3. JVM:类加载与字节码技术-2

    JVM:类加载与字节码技术-2 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 这部分内容在上一篇笔记中: 类文件结构 字节码指令 编译期处理 类加载阶段 ...

  4. Vue项目搭建常用的配置文件,request.js和vue.config.js

    request.js用来请求数据,封装的代码如下: import axios from 'axios' const request = axios.create({ timeout: 5000 }) ...

  5. 嵌入式单片机stm32之DMA实验

    一. 对于大容量的STM32芯片有2个DMA控制器,控制器1有7个通道,控制器2有5个通道 每个通道都可以配置一些外设的地址. 二. 通道的配置过程: 1. 首先设置CPARx寄存器和CMARx寄存器 ...

  6. RecyclerView使用详解

    使用RecyclerView要引用对应的jar包,但最新版的项目中,不用引用也可以使用. implementation 'com.android.support:recyclerview-v7:27. ...

  7. Ubuntu Python2 和 Python3 共存 切换

    例如 你写了代码 创建一个文件 在终端 vim test.py 然后写入代码 print "hello world" 接着运行代码 python test.py 会输出 hello ...

  8. 百亿级小文件存储,JuiceFS 在自动驾驶行业的最佳实践

    自动驾驶是最近几年的热门领域,专注于自动驾驶技术的创业公司.新造车企业.传统车厂都在这个领域投入了大量的资源,推动着 L4.L5 级别自动驾驶体验能尽早进入我们的日常生活. 自动驾驶技术实现的核心环节 ...

  9. DeWeb发展历程! 从2015年开始

    有位朋友问: [高中]长兴(667499XX) 2021-01-15 15:52:11 deweb会长期做吗 我查了一下,发现deweb最早从2015开始,算起来已经做了5~6年了,目前已日臻成熟!

  10. 【网络好文】---MySQL为Null导致的四大坑

    正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如所示: select version(); -- 版本为 8.0.22 "兵马未动粮草先行",看完了相关的配置之 ...