【Luogu】P3750分手是祝愿(期望DP)
2024-08-29 00:37:16
这题好喵啊……
设f[i]是最少用i次才能全关上转移到最少用i-1次才能全关上灯的期望值,那么n个灯里有i个是正确的,剩下的都是不正确的
因此期望是$f[i]=frac{n}{i}+frac{(n-i)*f[i+1]}{i}$
然后我们把初始状态最少用多少次才能关掉求出来
DP一遍,最后统计答案。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cstdlib>
#include<vector>
#define maxn 100020
#define mod 100003
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} vector<long long>s[maxn]; long long inv[maxn];
long long q[maxn];
long long f[maxn]; int main(){
long long n=read(),m=read();
inv[]=;
for(long long i=;i<=n;++i) inv[i]=(-mod/i*inv[mod%i]%mod+mod)%mod;
for(long long i=;i<=n;++i) q[i]=read();
for(long long i=;i<=n;++i)
for(long long j=i;j<=n;j+=i) s[j].push_back(i);
long long last=;
for(long long i=n;i>=;--i){
if(q[i]==) continue;
for(long long j=;j<s[i].size();++j) q[s[i][j]]^=;
last++;
}
f[n]=;
for(long long i=n-;i>m;--i) f[i]=(n*inv[i]%mod+((n-i)*f[i+]%mod)*inv[i]%mod)%mod;
for(long long i=;i<=m;++i) f[i]=;
long long ans=;
for(long long i=;i<=last;++i) ans=(ans+f[i])%mod;
for(long long i=;i<=n;++i) ans=(ans*i)%mod;
printf("%d\n",ans);
return ;
}
最新文章
- HTML5实现摇一摇
- .net using使用小结
- Linux平台Makefile文件的编写基础入门(课堂作业)
- UVa 106 - Fermat vs Pythagoras(数论题目)
- 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程
- -ffunction-sections -Wl,--gc-sections
- MySQL基础学习之开始
- error: File not found by glob???
- 字符串最小表示法 O(n)算法
- 光谱郑匡移动互联网O2O完美融合
- 如何把域名解析到网站空间IP上?
- 怎样用div做三角形
- MongoDB基本命令总结
- K-Means算法:图片压缩
- Oracle EBS FORM 更改记录状态
- Centos安装Oracle及问题处理
- C#多线程和异步(一)——基本概念和使用方法
- 索引视图DEMO2
- Mac 重建 Spotlight 索引
- C++语言的学习环境