当前位置: 首页 > news >正文

相逢是问侯,分手是祝愿。

Informatik verbindet dich und mich.

信息将你我连结。

Zeit und Raum trennen dich und mich.

时空将你我分开。

相逢是问侯

分手是祝愿

性质 \(1\):最优策略下,每个开关只会被操作至多 \(1\) 次。

证明 \(1\):一个开关操作 \(2\) 次等效于操作 \(0\) 次。

性质 \(2\):一定可以使所有灯都灭掉。

证明 \(2\):考虑构造性的做法,从大到小找到所有亮着的灯,操作对应的开关即可。

性质 \(3\):最优策略下存在唯一的操作方法。

证明 \(3\):局面和操作的方案数都是 \(2^n\),所有局面和操作方案构成双射。

性质 \(4\):所有开关均不能表示为其他开关的线性组合。

证明 \(4\):若可以,则一个局面对应多个操作方案。

我们可以利用性质 \(2\) 求出初始局面的最小操作次数 \(m\)

由性质 \(3\),我们可以求出需要操作的开关编号,而这是唯一的。

不妨求出序列 \(S\),若 \(S_i=0\) 则开关 \(i\) 不需要操作,若 \(S_i=1\) 则开关 \(i\) 需要操作。

一次操作相当于随机选择一个下标 \(i\),并反转 \(S_i\)

同时,当 \(S\)\(1\) 的个数不超过 \(k\) 时,即当前需要操作的次数 \(\leq k\),直接结束即可。

此时问题就只和 \(S\)\(1\) 的个数有关了。

我们令 \(f_i\) 表示 \(S\)\(1\) 的个数为 \(i\) 时,需要操作的次数期望。

对于 \(0 \leq i \leq k\),显然有 \(f_i = i\)

对于 \(k < i < n\),显然有 \(f_i = \dfrac{i}{n} \times f_{i-1} + \dfrac{n-i}{n} \times f_{i+1} + 1\)

对于 \(i = n\),显然有 \(f_i = f_{i-1} + 1\)

考虑令 \(f_n = x\),容易据此表示出所有 \(f_i\)

接下来,我们考虑令 \(i = k + 1\),由 \(f_i = \dfrac{i}{n} \times f_{i-1} + \dfrac{n-i}{n} \times f_{i+1} + 1\)\(f_{k+1} = \dfrac{k+1}{n} \times k + \dfrac{n-k-1}{n} \times f_{k+2} + 1\),容易据此解出 \(x\)

注意加一点特判,然后就能过了,复杂度大概可以做到 \(O(n \log n)\)

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const long long mod=100003;
long long inv(long long num){long long pre=mod-2,ans=1;while(pre){if(pre&1) ans=ans*num%mod;num=num*num%mod;pre>>=1;}return ans;
}
int n,k;
vector<int> G[100010];
long long fact[100010];
void init(){fact[0]=1;for(int i=1;i<=n;i++){fact[i]=fact[i-1]*i%mod;for(int j=i;j<=n;j+=i){G[j].push_back(i);}}
}
int op[100010];
long long k_x[100010],b_x[100010];
int main(){scanf("%d %d",&n,&k);init();for(int i=1;i<=n;i++){scanf("%d",&op[i]);}int cnt=0;for(int i=n;i>=1;i--){if(op[i]==1){cnt++;for(int j=0;j<G[i].size();j++){op[G[i][j]]^=1;}}}if(cnt<=k  ||  k==n-1){printf("%lld",cnt*fact[n]%mod);return 0;}k_x[n]=1;b_x[n]=0;k_x[n-1]=1;b_x[n-1]=mod-1;for(int i=n-1;i>=k+2;i--){long long pre_k=k_x[i],pre_b=b_x[i]-1;long long t_1=i*inv(n)%mod,t_2=(n-i)*inv(n)%mod;pre_k-=t_2*k_x[i+1]%mod;pre_k=(pre_k%mod+mod)%mod;pre_b-=t_2*b_x[i+1]%mod;pre_b=(pre_b%mod+mod)%mod;k_x[i-1]=pre_k*inv(t_1)%mod;b_x[i-1]=pre_b*inv(t_1)%mod;}long long pre_k=k_x[k+1],pre_b=-b_x[k+1]+1;long long t_1=(k+1)*inv(n)%mod,t_2=(n-k-1)*inv(n)%mod;pre_b+=t_1*k%mod;pre_b=(pre_b%mod+mod)%mod;pre_k-=t_2*k_x[k+2]%mod;pre_k=(pre_k%mod+mod)%mod;pre_b+=t_2*b_x[k+2]%mod;pre_b=(pre_b%mod+mod)%mod;long long x=pre_b*inv(pre_k)%mod;printf("%lld",(k_x[cnt]*x%mod+b_x[cnt])%mod*fact[n]%mod);return 0;
}
http://www.jsqmd.com/news/183839/

相关文章:

  • 全链路开发过程的名词术语
  • SSA-Transformer-GRU分类预测+SHAP分析,Matlab代码
  • 基于峰谷分时电价引导下的电动汽车充电负荷优化Matlab代码
  • 整合AI排版工具一键适配格式标准(如LaTeX或APA),节省校对时间
  • NGO-VMD北方苍鹰算法优化变分模态分解+皮尔逊系数+小波阈值降噪+信号重构,MATLAB代码
  • 预订接口 V2 优化:使用本地消息表保证订单生成、库存扣减的一致性
  • AI智能改写工具助力论文写作,提升效率与质量
  • 利用AI语法检查工具修正学术表达,避免冗余句式与术语误用
  • 有声书制作新利器:VoxCPM-1.5-TTS实现高质量语音朗读
  • 很多人都不知道的打印技巧 看完受用
  • 2025年WPS论文写作解决方案:精选插件与AI协同工作
  • 国际化部署考虑:在全球多地部署Sonic服务节点
  • 战略规划时常见的 8 个难点
  • 机器人运动学视频小结
  • 数字信号处理篇---DET的性质
  • 团队作业1
  • AI辅助学术写作:9款高效工具深度测评,一键生成开题报告与论文草稿
  • AI技术赋能学术写作,9款智能工具测评揭示高效论文生成方案
  • 运用AI查重系统交叉比对全球数据库,确保原创性符合学术规范
  • miniforge和anaconda对比
  • 数字信号处理篇---循环卷积和线性卷积的关系
  • 从郁金香泡沫到加密货币:400年投机游戏的同与不同
  • 利用AI提升学术写作效率,9款智能工具评测,开题报告与论文初稿秒级完成。
  • 2025终极AI论文神器:7款免费工具实测,查重<13%超靠谱!
  • 智能化学术写作:9款工具评测,助你快速完成开题报告与论文初稿
  • 救命神器8个AI论文平台,继续教育学生轻松搞定毕业论文!
  • 救命神器8个AI论文平台,继续教育学生轻松搞定毕业论文!
  • Kubernetes 架构图和组件
  • 学术写作效率升级:9款AI辅助工具推荐,从开题到初稿全程加速
  • Springboot剧本杀预约管理系统97383(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。