首页 > 其他分享 >P3750 [六省联考 2017] 分手是祝愿

P3750 [六省联考 2017] 分手是祝愿

时间:2023-06-05 13:22:26浏览次数:37  
标签:六省 int long leq 序列 P3750 frac 联考 mod

简要题意

Zeit und Raum trennen dich und mich. 时空将你我分开。

有一个长度为 \(n\) 的 \(01\) 序列。ZYB 君在 ZBZ 爷爷的指引下,重复进行以下操作,直到原序列变成全 \(0\) 序列:

  • ZBZ 爷爷用他智慧的双眼看看这个序列需要 ZYB 君最多进行几次操作,如果只要进行最多 \(k\) 次,就直接用用最好的方法进行这些操作。
  • ZYB 君进行一次操作,操作方法为等概率选择一个数 \(p\),将 \(p\) 的全部因子对应的序列上的值取反。

问期望操作次数。答案乘上 \(n!\) 然后对 \(100003\) 取模。

\(0 \leq k \leq n \leq 10^5\),对于 \(50\%\) 的数据,有 \(k=n\)。

思路

50pts

50pts,实际上是 80pts。

其实就是 ZBZ 的智慧双眼生效了。我们只需要讨论最优方案。

引理:\(\forall x,\not\exists y<x\),使得可以操作 \(y\) 来改变 \(x\)。

Proof: 显然有 \(\forall i|x,i\leq x\)。证毕。

所以我们可以从大到小,只要是 \(1\) 就操作。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 100005,mod = 100003;
int n,k,a[N];
vector<int> factor[N];

signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;i*j<=n;j++) factor[i*j].push_back(i);
	}
	int ans=0;
	for(int i=n;i;i--){
		if(!a[i]) continue;
		ans++;
		for(int j : factor[i]) a[j]^=1;
	}
	for(int i=1;i<=n;i++) ans=ans*i%mod;
	cout<<ans;
	return 0;
}

100pts

我们考虑一般情况,令 \(f(i)\) 为将操作数为 \(i\) 的变成操作数为 \(i-1\) 的的期望次数。则:

\[f(i)=\frac{i}{n}+\frac{n-i}{n}(f(i+1)+f(i)+1) \]

稍微解释一下,第一种情况是 \(\frac{i}{n}\) 选择了正确的地方。第二种情况是 \(\frac{n-i}{n}\) 的概率就是用 \(1\) 次变成期望 \(i+1\) 次,我们还需要一次 \(f(i+1)\) 和一次 \(f(i)\)。

然后如果 50pts 暴力搞就搞,否则你就按照期望公式,\(k+1\leftarrow\text{暴力次数}\) 都可能是一种情况,求出它们的和加上 \(k\) 即可。

这就是期望的答案。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 100005,mod = 100003;
int n,k,a[N],f[N],inv[N]={1,1};
vector<int> factor[N];

signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;i*j<=n;j++) factor[i*j].push_back(i);
	}
	for(int i=2;i<=n;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
//	for(int i=2;i<=n;i++) cout<<inv[i]<<' ';cout<<'\n';
	int ans=0;
	for(int i=n;i;i--){
		if(!a[i]) continue;
		ans++;
		for(int j : factor[i]) a[j]^=1;
	}
	for(int i=n;i;i--){
		f[i]=(n+(n-i)*f[i+1])%mod;
		f[i]*=inv[i];
		f[i]%=mod;
//		cout<<f[i]<<' ';
	}
	if(ans>k){
		int ret=0;
		for(int i=ans;i>k;i--) ret+=f[i];
		ans=(ret%mod+k)%mod;
	}
	for(int i=1;i<=n;i++) ans=ans*i%mod;
	cout<<ans;
	return 0;
}

标签:六省,int,long,leq,序列,P3750,frac,联考,mod
From: https://www.cnblogs.com/zheyuanxie/p/p3750.html

相关文章

  • 2023 五月联考游记
    \(2023\)五月联考游记date5.28有点紧张,但还好。从四月到五月基本上都全在看语文,但是也不知道怎么样。其他基本没弄。等着寄喽!无所谓,我会?date5.29上午语文。发下卷子直接跳到作文,看到是个普通二元思辨,感到非常安心。然后开做,但是做完现\(\rmI\)用了\(22\min\),做完现......
  • 【题解】Luogu[P3750] [六省联考 2017] 分手是祝愿
    Link→小清新dp题,纪念自己的700ac(一个点只有两个状态开和不开,且按两下相当于没按,我们可以从大到小有亮的就按一下,如果我们按到了不需要按的键,就需要再按一下使他变回来。设\(f_i\)表示\(i\)个正确选择变为\(i-1\)个的期望操作次数。则有\(\dfrac{i}{n}\)概率按到......
  • [省选联考 2020 A 卷] 组合数问题
    组合数问题首先明确下降幂即\[k^{\underlinem}=\sum_{i=k-m+1}^ki\]不难发现有\[\binom{n}{k}k^{\underlinem}=\binom{n-m}{k-m}n^{\underlinem}\]我们尝试把普通幂多项式转为下降幂多项式\[\sum_{i=0}^ma_ik^i=\sum_{i=0}^mb_ik^{\underlinei}\]由第二类斯特林数的......
  • P9166 [省选联考 2023] 火车站
    P9166[省选联考2023]火车站这道题很抽象,有这么几点注意事项1,火车必须走到尽头才可以停下,所以答案一定会出于输入的这些端点2,火车只能往一个方向走,不可以在中途换向那么这题怎么处理?不会真的要一波操作然后把所有答案排个序吧?我选择标记法!标记答案,省去了排序的过程。那么......
  • [省选联考2023] 过河卒
    [省选联考2023]过河卒题目背景棋盘上有一个过河卒,需要走到底线。卒行走的规则是可以向左移动一格,向右移动一格或者向前移动一格。同时在棋盘上有两个另一方的棋子,需要拦截这个卒走到底线。这两个棋子的走法和帅一致,可以走到前后左右四个方向上相邻的格子。因此本题可以称为“......
  • 【题解】P4363 [九省联考 2018] 一双木棋 chess
    原题链接题目描述菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋......
  • 2023河南事业单位联考报名时间用手机提醒
    2023年的河南事业单位公开招聘联考又到了,那么本次考试的报名时间是什么时候呢?按照相关公告来看,今年河南事业单位联考的报名时间是从4月12日9:00—4月17日17:00,而缴费时间是从4月17日9:00—4月23日17:00,笔试时间为5月20日(周六)上午9:00—10:30,下午14:00—15:30。如果你打算参加本......
  • 「解题报告」P9169 [省选联考 2023] 过河卒
    挺套路的博弈论,实际上就是GameonGraph与GameonGraph,但是考场上多测没清空挂了。寄。并且不过ABC那个官方题解好像给的是\(O(m\logn)\)的做法,放这题是过不去的啦x首先显然三个棋子压状态大概是\(10^6\)级别的,多测\(T=10\),那么猜测是一个\(O(Tn^6)\)的做法。......
  • [省选联考 2023] 染色数组 题解
    题目描述给定一个长度为\(n\)的正整数数组\(A\),其中每个数都在\(1\)到\(m\)之间,从左到右排成一排。现在要将每个数字染成红色或者绿色,我们定义一个染色方案为优秀的染色方案,当且仅当它满足:每个数\(A_{i}\)要么被染成红色,要么被染成绿色。红色的数从左到右依次严格递......
  • [省选联考 2023] 染色数组 题解
    题目描述给定一个长度为\(n\)的正整数数组\(A\),其中每个数都在\(1\)到\(m\)之间,从左到右排成一排。现在要将每个数字染成红色或者绿色,我们定义一个染色方案为优秀的染色方案,当且仅当它满足:每个数\(A_{i}\)要么被染成红色,要么被染成绿色。红色的数从左到右依次严格递......