大家都很强, 可与之共勉 。

题意:
   B君在玩一个游戏,这个游戏由N个灯和N个开关组成,给定这N个灯的初始状态,下标为从1到N的正整数。每个灯有两个状态亮和灭,我们用1来表示这个灯是亮的,用0表示这个灯是灭的,游戏的目标是使所有灯都灭掉。但是当操作第i个开关时,所有编号为i的约数(包括1和i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮。 B 君在玩一个游戏,这个游戏由 N 个灯和 N 个开关组成,给定这 N 个灯的初始状态,下标为从 1 到 N 的正整数。每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉。但是当操作第 i 个开关时,所有编号为i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮。

   B君发现这个游戏很难,于是想到了这样的一个策略,每次等概率随机操作一个开关,直到所有灯都灭掉。这个策略需要的操作次数很多,B君想到这样的一个优化。如果当前局面,可以通过操作小于等于k个开关使所有灯都灭掉,那么他将不再随机,直接选择操作次数最小的操作方法(这个策略显然小于等于k步)操作这些开关。B君想知道按照这个策略(也就是先随机操作,最后小于等于k步,使用操作次数最小的操作方法)的操作次数的期望。这个期望可能很大,但是B君发现这个期望乘以N的阶乘一定是整数,所以他只需要知道这个整数对100003取模之后的结果。 B 君发现这个游戏很难,于是想到了这样的一个策略,每次等概率随机操作一个开关,直到所有灯都灭掉。这个策略需要的操作次数很多,B 君想到这样的一个优化。如果当前局面,可以通过操作小于等于k 个开关使所有灯都灭掉,那么他将不再随机,直接选择操作次数最小的操作方法(这个策略显然小于等于k 步)操作这些开关。B 君想知道按照这个策略(也就是先随机操作,最后小于等于k 步,使用操作次数最小的操作方法)的操作次数的期望。这个期望可能很大,但是B 君发现这个期望乘以N 的阶乘一定是整数,所以他只需要知道这个整数对100003 取模之后的结果。

   输入输出格式 输入输出格式

   输入格式: 输入格式:
   第一行两个整数N,k。 第一行两个整数N , k。
   接下来一行N个整数,每个整数是0或者1,其中第i个整数表示第i个灯的初始情况。 接下来一行N 个整数,每个整数是 0 或者 1,其中第 i 个整数表示第 i 个灯的初始情况。
   1≤N≤100000,0≤k≤N 1≤N≤100000 ,0≤k≤N

题解:
  我萌先贪心好了,就不考虑随机,找最优解。
  考虑到操作第 i i个开关的时候,只会影响到≤i\leq i的,于是我萌可以知道的是,从大到小操作一定是最优的。考虑到您操作一个开关两次等于不操作,所以每一次一定是找到最大的且亮着的来操作。这样一定是最优的。复杂度为 O(nn√)或O(nlogn) O(n\sqrt{n})或O(nlogn)。
  然后我们来考虑如何处理期望的问题。
  首先定义 f(x) f(x)为 x x步后结束的期望,显然当x≤kx\leq k时, f(x)=x f(x)=x(因为它已经被钦定了)。
  显然有这么个转移

f(x)=xn⋅f(x−1)+n−xn⋅f(x+1)+1

f(x)=\frac{x}{n}\cdot f(x-1)+\frac{n-x}{n}\cdot f(x+1)+1

  于是就得到了一个做法。
  但是我当时脑抽想到了一个问题, mmp mmp要是不能初始化 f(x) f(x)怎么办,就是一个样例( k<1 k)……

  于是就改了一种定义(其实它是可以做的见万古神犇WYS)

  差分定义令 g(x) g(x)为从 x x步第一次到x−1x-1步的期望,于是就可以得到转移

g(x)=xn⋅+n−xn⋅(g(x+1)+g(x)+1)

g(x)=\frac{x}{n}\cdot+\frac{n-x}{n}\cdot (g(x+1)+g(x)+1)

  其中 x≤k||x=n x\leq k||x=n时, g(x)=1 g(x)=1。
  这样不用考虑初始化……

  于是我们把最少步数找到,然后答案累加起来。

  话说这道题完全如果给的模数不是质数,也可以做。

# include <bits/stdc++.h>namespace In  {
# define In_Len 2000000static std :: streambuf *fb ( std :: cin.rdbuf ( ) ) ;static char buf [In_Len], *ss ( 0 ), *tt ( 0 ) ;
# define pick( )  ( (ss == tt) ? ( tt = buf + fb -> sgetn ( ss = buf, In_Len ), ((ss == tt) ? -1 : *(ss ++)) ) :*(ss ++) )inline char getc ( )  {  register char c ; while ( isspace ( c = pick ( ) ) ) ;  return c ;  }inline int read ( )  {register int x, c ;bool opt ( 1 ) ;while ( ! isdigit ( c = pick ( ) ) && ( c ^ -1 ) && ( c ^ 45 ) ) ;if ( c == 45 )  c = pick ( ), opt = 0 ;for ( x = -48 + c ; isdigit ( c = pick ( ) ) ; ( x *= 10 ) += c - 48 ) ;return opt ? x : -x ;}
# undef pick
# undef In_Len
}const int N = 100010 ;bool a [N] ;
int pool [N * 18], *iter = pool, cnt [N], cur [N], *d [N] ;int main ( )  {int n, k, fac_n ( 1 ) ;n = In :: read ( ), k = In :: read ( ) ;for ( int i = 1 ; i <= n ; ++ i )  {for ( int j = i ; j <= n ; j += i )  {++ cnt [j] ;}}for ( int i = 1 ; i <= n ; ++ i )  {d [i] = iter ;iter += cnt [i] ;}for ( int i = 1 ; i <= n ; ++ i )for ( int j = i ; j <= n ; j += i )  {d [j] [cur [j] ++] = i ;}for ( int i = 1 ; i <= n ; ++ i )  {a [i] = ( bool ) ( In :: getc ( ) - 48 ) ;fac_n = 1LL * fac_n * i % 100003 ;}int rt ( 0 ) ;for ( int i = n ; i >= 1 ; -- i )if ( a [i] )  {for ( int j = cnt [i] - 1 ; j >= 0 ; -- j )  {a [d [i] [j]] ^= 1 ;}++ rt ;}if ( rt <= k )  return printf ( "%d\n", 1LL * rt * fac_n % 100003 ), 0 ;static int inv [N], f [N] ;inv [1] = 1 ;for ( int i = 2 ; i <= n ; ++ i ) inv [i] = 1LL * ( 100003 - 100003 / i ) * inv [100003 % i] % 100003 ;for ( int i = 1 ; i <= k ; ++ i ) f [i] = 1 ;f [n] = 1 ; for ( int i = n - 1 ; i > k ; -- i ) f [i] = 1LL * ( 1LL * ( n - i ) * f [i + 1] % 100003 + n ) * inv [i] % 100003 ;int ans ( 0 ) ;for ( int i = 1 ; i <= rt ; ++ i ) ans += f [i] ;printf ( "%d\n", 1LL * ans * fac_n % 100003 );return 0 ;
}

BZOJ4872 [SHOI2017]分手是祝愿相关推荐

  1. 【期望】BZOJ4872 [SHOI2017] 分手是祝愿

    [前言] 疯狂做概率期望.jpg [题目] 一个游戏由nnn盏灯和nnn个开关组成,给定初始灯的状态(亮或灭).当操作第iii个开关,则会将所有编号为iii的约数的灯状态取反.当可以通过≤k\leq ...

  2. 4872: [Shoi2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 153 Solved: 109 [Submit][Statu ...

  3. bzoj 4872 [Shoi2017]分手是祝愿

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

  4. 【BZOJ4872】分手是祝愿

    分手是祝愿 [题目大意] 有n 个灯,每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 ...

  5. [SHOI2017]分手是祝愿

    题目: https://ac.nowcoder.com/acm/problem/20437 有nnn盏灯,111表示开的,000表示关的.每次操作随机选一个开关i(1≤i≤n)i(1\le i\le ...

  6. [SHOI2017] 分手是祝愿

    Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...

  7. bzoj 4872: [Shoi2017]分手是祝愿

    题意 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 ...

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

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

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

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 458  Solved: 299 [Submit][Sta ...

最新文章

  1. 数据结构与算法(2-1)线性表之顺序存储(顺序表)
  2. poj 2482 Stars in Your Window(线段树+离散化+线扫描)
  3. Jenkins cve-2016-0792 漏洞复现 Xstream 反序列化漏洞
  4. 搭建yum源,配置yum源
  5. Guava学习笔记:Preconditions优雅的检验参数
  6. 一步步教你如何用疯狂.NET架构中的通用权限系统 -- 分级管理
  7. DynaSLAM跑通的辛酸之路
  8. 你该知道的深度强化学习相关知识
  9. 操作系统课设:实现一个mini_shell
  10. DenyHosts清除黑名单IP地址方法
  11. sis9280触摸ic 基于rk3288 的安卓4.4的 多点触摸
  12. java web插件下载_javaweb开发1.环境配置(javaweb插件下载及tomact在eclips中配置)
  13. python 中gcd用法_Python中while语句的基本用法不了解一下嘛?
  14. java字符串计数从零还是从一,java – 计数和所有字符相同的最大字符串的起始索引...
  15. vs vb连接mysql,用vs2010的vb.net建立和access数据库的连接后的奇怪问题:关于本地复制...
  16. Java中获取实时时间
  17. 一些有用软件收藏(更新中)
  18. Android Binder机制
  19. 一本通1665【例 3】移棋子游戏
  20. Windows11下Edge浏览器登录工行农行并使用K宝U盾

热门文章

  1. text改为longtext
  2. 王者荣耀服务器维护多久结束,王者荣耀健康系统重置时间 时间限制规则详解...
  3. Python可视化|matplotlib05-绘图风格大全
  4. Windows与USB的通信
  5. mysql介绍索引类型的章节_mysql索引总结--mysql索引类型以及创建的详细介绍
  6. RationalDMIS 2020 叶片检测 -快速定义叶片截面线方法
  7. 我看华为鸿蒙操作系统
  8. c语言面试题下载,C语言笔试题A.doc
  9. truffle填坑指南:truffle unbox react项目npm run start启动失败
  10. 检测色卡饱和度和色彩偏差