「国家集训队」单选错位 题解

本文网址:https://www.cnblogs.com/zsc985246/p/16366596.html ,转载请注明出处。

题目大意

试卷上共有 n 道单选题,第 i 道题有 ai 个选项,每个选项成为正确答案的概率都是相等的。

A 全部做对,但抄错位了:每题都向后抄了一个位置,特别地,第 n 道题目抄到了第 1 道题目的位置

A 想知道自己期望能做对几道题目。

思路

数据范围 n107 ,说明需要 O(n) 的算法解决。

通过样例仔细观察后,我们可以发现,i 题是否正确,只与第 i1 题的答案是否跟第 i 题相同有关

举个例子:

a=2,3,1

对于第 1 题和第 2 题,正确答案的总情况数为 a[1]×a[2]=6 ,而两道题答案相同的只有 min(a[1],a[2])=2 种。最终做对的概率为 min(a[1],a[2])a[1]×a[2]=13

为什么要求最小值?

因为当第二题答案为 3 时,第一题答案不可能与它相同。所以相同情况数取决于它们的最小值。

由上可得:两道题的正确答案情况总数为 a[i]×a[i1] ,两道题答案相等的情况有 min(a[i],a[i1]) 种,所以答案需要加上一个 min(a[i],a[i1])a[i]×a[i1]

化简一下:

     min(a[i],a[i1])a[i]×a[i1]

=1max(a[i],a[i1])

注意,这里的 min 变成了 max

min(a[i],a[i1])=a[i] 时,原式变为 1a[i1]

min(a[i],a[i1])=a[i1] 时,原式变为 1a[i]

综合一下,就是 1max(a[i],a[i1])

对于特殊情况只需要再加上 1max(a[n],a[1]) 即可。

最终公式为:

ans=1max(a[n],a[1])+ni=21max(a[i],a[i1])

因此,代码出。

代码实现

#include<bits/stdc++.h>
#define ll int
const ll N=10000010;//1e7+10 
using namespace std;

ll n,A,B,C,a[N];
double ans;//答案 

int main(){
	
	scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1);
	for(int i=2;i<=n;i++)
		a[i]=((long long)a[i-1]*A+B)%100000001;
	for(int i=1;i<=n;i++)
		a[i]=a[i]%C+1;
	
	for(ll i=2;i<=n;i++){//是2~n 
		ans+=1.0/max(a[i],a[i-1]);//公式 
	}
	ans+=1.0/max(a[n],a[1]);//特殊处理 
	printf("%.3lf",ans);//输出 
	
	return 0;
}

尾声

如果你发现了问题,你可以直接回复这篇题解

如果你有更好的想法,也可以直接回复!

posted @   zsc985246  阅读(246)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示