[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=4872

[算法]

首先发现 , 对于一个开关 , 按下2次和没按是等价的 , 因此每个开关最多按一次

考虑k = n的情况 , 只需简单倒序贪心即可

考虑随机的情况 , 由观察可知一个开关不能由多个开关组合得到

用fi表示i次将所有开关变关到(i - 1)次将所有开关变关的期望步数

有转移方程fi = i / n + (1 - i / n) * (1 + fi + 1 + fi)

将该转移方程看作一个一元一次方程 , 即可解出fi

不再赘述 , 详见代码

时间复杂度 : O(N)

[代码]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int P = ;
const int N = ; int n , k , cnt;
int a[N] , inv[N] , dp[N];
vector< int > D[N]; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
} int main()
{ read(n); read(k);
for (int i = ; i <= n; ++i) read(a[i]);
inv[] = ;
for (int i = ; i <= n; ++i) inv[i] = 1ll * (P - P / i) * inv[P % i] % P;
for (int i = ; i <= n; ++i)
{
for (int j = i; j <= n; j += i)
{
D[j].push_back(i);
}
}
for (int i = n; i >= ; --i)
{
if (a[i])
{
for (unsigned j = ; j < D[i].size(); ++j)
a[D[i][j]] ^= true;
++cnt;
}
}
int ans = ;
if (cnt <= k)
ans = cnt;
else
{
dp[n] = ;
for (int i = n - ; i >= ; --i) dp[i] = (1ll * dp[i + ] * (n - i) % P * inv[i] % P + 1ll * n * inv[i] % P) % P;
for (int i = cnt; i > k; --i) ans = (ans + dp[i]) % P;
ans = (ans + k) % P;
}
for (int i = ; i <= n; ++i) ans = 1ll * ans * i % P;
printf("%d\n" , ans); return ; }

最新文章

  1. STM32之看门狗(独立与窗口)
  2. BZOJ 1303 CQOI2009 中位数图 水题
  3. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体
  4. Oracle工具之DBNEWID
  5. 《ASP.NET1200例》ListView 控件与DataPager控件的结合&lt;二&gt;
  6. ArcGIS10.2最新全套下载地址
  7. !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  8. [codility]Prefix-set
  9. LeeCode(Database)-Employees Earning More Than Their Managers
  10. java+jsp+sql server实现网页版四则运算.
  11. React的组件模式
  12. python改文件名
  13. ubuntu 调整分辨率
  14. Python3.X爬虫
  15. 007.基于Docker的Etcd分布式部署
  16. [转载]Oracle修改用户表所属表空间的步骤
  17. Python中的类(中)
  18. 887. Super Egg Drop
  19. java中无参,有参,默认构造方法的应用及举例
  20. UNIX环境高级编程 第11章 线程

热门文章

  1. python 使用微信远程控制电脑
  2. Source-php-request-2
  3. 把握linux内核设计思想(二):硬中断及中断处理
  4. HandlerMethodArgumentResolver 参数解析器
  5. 阿里云Opensearch数据类型
  6. phpstorm pycharm IntelliJ IDEA激活
  7. 用nvm管理windows nodejs时用npm全局安装的插件无法调用的解决方案
  8. flex做页面。用来做视频的后台服务器是fms
  9. Java中synchronized
  10. 【tensorflow】tensorflow学习记录——安装、第一个程序篇