LOJ#2145. 「SHOI2017」分手是祝愿

题目描述

Solution

首先有一个结论:
灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优操作序列b1,b2...bnb_1,b_2...b_nb1​,b2​...bn​。
因为编号最大的灯只能由开关自己来改变。

因此,就相当于你有一个操作序列bbb,当其中111的个数小于等于kkk时,你就会直接按最优解操作(即只会选最优操作序列中的111),否则随机把操作序列中的一个位置010101反转,求变为全000期望步数。

这一题有一个巧妙的dpdpdp。
令fif_ifi​表示从有iii个111走到有i−1i-1i−1个111所需要的期望步数。

根据定义与期望的线性性,显然Ans=∑i≤cntfiAns=\sum_{i\leq cnt} f_iAns=∑i≤cnt​fi​,cntcntcnt表示操作序列有多少个111。

现在考虑fff怎么求。

显然每一次操作,有n−in\frac{n-i}{n}nn−i​增加一个111,也有in\frac{i}{n}ni​的概率减少,所以有:
fi=infi+n−in(1+fi+fi+1)f_i=\frac{i}{n}f_i+\frac{n-i}{n}(1+f_i+f_{i+1}) fi​=ni​fi​+nn−i​(1+fi​+fi+1​)
表示要么减少一个111,要么增加一个111,再减少回来。
因此可以从fnf_nfn​直接递推过来,时间复杂度O(n)O(n)O(n)。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=100003;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int a[MAXN],f[MAXN],fac[MAXN],inv[MAXN];
inline int upd(int x,int y){ return x+y>=mods?x+y-mods:x+y; }
inline int quick_pow(int x,int y)
{int ret=1;for (;y;y>>=1){if (y&1) ret=1ll*ret*x%mods;x=1ll*x*x%mods;}return ret;
}
void Init(int n)
{fac[0]=1;for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mods;for (int i=1;i<=n;i++) inv[i]=quick_pow(i,mods-2);
}
int main()
{int n=read(),k=read(),cnt=0;Init(n);for (int i=1;i<=n;i++) a[i]=read();for (int i=n;i>=1;i--){if (!a[i]) continue;cnt++;for (int j=1;j*j<=i;j++)if (i%j==0) {a[j]^=1;if (j*j!=i) a[i/j]^=1;}
//      for (int j=1;j<=n;j++) cout<<a[j]<<" ";cout<<endl;}
//  cout<<cnt<<endl;f[n]=1;for (int i=1;i<=k;i++) f[i]=1;for (int i=n-1;i>k;i--) f[i]=upd(1ll*f[i+1]*(n-i)%mods*inv[i]%mods,1ll*n*inv[i]%mods);int ans=0;for (int i=1;i<=cnt;i++) ans=upd(ans,f[i]);printf("%d\n",1ll*ans*fac[n]%mods);return 0;
}

LOJ#2145. 「SHOI2017」分手是祝愿相关推荐

  1. loj2145 「SHOI2017」分手是祝愿

    记 \(f_i\) 是从要做 \(i\) 步好操作变成要做 \(i-1\) 步好操作的期望操作次数. 显然 \(f_i=i/n \times 1 + (1-i/n) \times (1 + f_{i+ ...

  2. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  3. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  4. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  5. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  6. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  7. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  8. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

  9. Loj #2983. 「WC2019」数树

    Loj #2983. 「WC2019」数树 题目背景 白兔喜欢树. 白云喜欢数数. 有 \(n\) 只鼠,白兔用 \(n − 1\) 根蓝色绳子把它们连成了一棵树,每根蓝色绳子连着两只鼠,白云用 \( ...

最新文章

  1. OpenSource的开发模式探讨
  2. WinRar 代替之选:7-Zip+7zSfxTool
  3. 用JS实现一个定时间段的跳转
  4. 一条进程的栈区、堆区、数据区和代码区在内存中的映射
  5. python相关linux_Python实现获取Linux系统基本信息
  6. MySQL社区版的下载和安装
  7. 胖球为李佳琦做数据?官方回应:系不实信息 已提出了投诉举报
  8. java dataset类的方法,C#中DataSet转化为实体集合类的方法
  9. Avast I Love You
  10. 【U盘量产工具】windows无法完成格式化——芯邦主控CBM2098S
  11. 联想重装系统去掉保护_如何去掉联想硬盘保护系统?
  12. 颜色透明度16进制对照表
  13. 谷歌浏览器Network详解
  14. 基于JAVA-超市会员积分管理系统-计算机毕业设计源码+系统+lw文档+部署
  15. STM32F4应用-GPIO
  16. Linux 解压,压缩文件--tar 命令
  17. python3 获取/备份 iPhone icloud云端 中相关数据
  18. 不能打开要写入的文件,软件安装不上解决方法
  19. 超宽带(UWB)无线通信技术介绍
  20. Android 8 WiFi断流,小米8wifi断流怎么解决

热门文章

  1. 微信改成右滑删除_手机文件数据恢复,怎样恢复已过期的微信附件呢?
  2. 你的女神今日结婚了!!!你失恋了......
  3. 带你见识不一样的世界,这5部豆瓣纪录片不可错过!
  4. 程序员从入门到升级,或许可以看一看这几个公众号
  5. 颠覆认知!完美赌徒,到底是如何用数学打造经济神话?!
  6. 这些肢体语言竟然是这个意思! | 今日最佳
  7. 提升代码可读性的 10 个技巧
  8. android 监听布局改变,Android通过监听最外层布局的改变监听键盘的状态,软键盘的弹出和收起都会改变外层布局(前提是把Activity的mode设置成压缩);...
  9. etcd php,etcd集群备份和数据恢复
  10. 新增一个主键自增长_MyBatis 示例-主键回填