LG·单选错位【期望】

Description–

> l i n k link link

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

z z l zzl zzl 认真地做完了这 n n n 道题目,可是没想到答题卡抄错位了:第 i i i 道题目的答案被 z z l zzl zzl 认真地抄到了答题纸上的第 i + 1 i+1 i+1 道题目的位置上,特别地,第 n n n 道题目的答案则被 z z l zzl zzl (用超能力) 抄到了第 1 1 1 道题目的位置上。

现在 可怜的 z z l zzl zzl 已经走出考场没法改了,不过她还是想知道自己期望能做对几道题目,这样她就知道会不会被 开考秒阿克的 k j kj kj 鄙视了。

我们假设 运气很好的 z z l zzl zzl 没有做错任何题目,只是答案抄错位置了。


Input–

n n n 很大,为了避免读入耗时太多,输入文件只有 5 5 5 个整数参数 n , A , B , C , a 1 n, A, B, C, a_1 n,A,B,C,a1 ,由上交的程序产生数列 a a a。下面给出 C + + C++ C++ 的读入语句和产生序列的语句(默认从标准输入读入):

scanf("%d%d%d%d%d", &n, &A, &B, &AK, zzl + 1);
for (int i = 2; i <= n; i++)
	zzl[i] = ((long long)zzl[i - 1] * A + B) % 100000001;
for (int i = 1; i <= n; i++)
	zzl[i] = zzl[i] % AK + 1;

选手可以通过以上的程序语句得到 n n n 和数列 a a a a a a 的元素类型是 32 32 32 位整数), n n n a a a 的含义见题目描述。

别管什么意思,照搬即可

Output–

输出一个实数,表示 z z l zzl zzl 期望做对的题目个数,保留三位小数。


Sample Input–

3 2 0 4 1

Sample Output–

1.167

说明–

数据范围
对于 30 % 30\% 30% 的数据, n ≤ 10 , C ≤ 10 n\leq 10, C\leq 10 n10,C10
对于 80 % 80\% 80% 的数据, n ≤ 1 0 4 , C ≤ 10 n\leq 10^4, C\leq 10 n104,C10
对于 90 % 90\% 90% 的数据, n ≤ 5 × 1 0 5 , C ≤ 1 0 8 n\leq 5\times 10^5, C\leq 10^8 n5×105,C108
对于 100 % 100\% 100% 的数据, 2 ≤ n ≤ 1 0 7 , 0 ≤ A , B , C ≤ 1 0 8 2\leq n\leq 10^7, 0\leq A,B,C \leq 10^8 2n107,0A,B,C108


解题思路–

假设当前的题为 a i a_i ai,则上一题为 a i − 1 a_{i -1} ai1

  • a i < a i − 1 a_i < a_{i -1} ai<ai1 时,此题做对的可能性为 1 a i − 1 \frac{1}{a_{i -1}} ai11
  • a i > = a i − 1 a_i >= a_{i -1} ai>=ai1 时,此题做对的可能性为 1 a i \frac{1}{a_i} ai1

可是即便如此 可怜的 z z l zzl zzl 还是不知道她期望做对的题目个数是多少
于是 无语的 k j kj kj 反手一顿骚操作,并鄙视地说:“每一道题做对的可能性就是 1 m a x ( a i , a i − 1 ) \frac{1}{max(a_i,a_{i -1})} max(ai,ai1)1啊!!!”

> > > 相加即可快乐获得 z z l zzl zzl的对题期望


代码–

#include <iostream>
#include <cstdio>

using namespace std;

int n, A, B, AK, zzl[10000005];
double kj;

void read()
{
	scanf("%d%d%d%d%d", &n, &A, &B, &AK, zzl + 1);
    for (int i = 2; i <= n; i++)
	    zzl[i] = ((long long)zzl[i - 1] * A + B) % 100000001;
    for (int i = 1; i <= n; i++)
	    zzl[i] = zzl[i] % AK + 1;  //zzl%AK??(hhhhhhh
}

int main()
{
	read();
	zzl[0] = zzl[n]; //因为zzl的神奇超能力于是答案n抄到了第1道题目的位置上qaq
	for (int i = 1; i <= n; ++i)
	  kj += 1.0 / max(zzl[i - 1], zzl[i]);
	printf("%.3lf", kj);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值