• 【刷题】BZOJ 2134 单选错位


    Description

    Input

    n很大,为了避免读入耗时太多,

    输入文件只有5个整数参数n, A, B, C, a1,

    由上交的程序产生数列a。

    下面给出pascal/C/C++的读入语句和产生序列的语句(默认从标准输入读入):

    // for pascal

    readln(n,A,B,C,q[1]);

    for i:=2 to n do q[i] := (int64(q[i-1]) * A + B) mod 100000001;

    for i:=1 to n do q[i] := q[i] mod C + 1;

    // for C/C++

    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;

    选手可以通过以上的程序语句得到n和数列a(a的元素类型是32位整数),

    n和a的含义见题目描述。

    2≤n≤10000000, 0≤A,B,C,a1≤100000000

    Output

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

    Sample Input

    3 2 0 4 1

    Sample Output

    1.167
    【样例说明】
    a[] = {2,3,1}
    正确答案 gx的答案 做对题目 出现概率
    {1,1,1} {1,1,1} 3 1/6
    {1,2,1} {1,1,2} 1 1/6
    {1,3,1} {1,1,3} 1 1/6
    {2,1,1} {1,2,1} 1 1/6
    {2,2,1} {1,2,2} 1 1/6
    {2,3,1} {1,2,3} 0 1/6
    共有6种情况,每种情况出现的概率是1/6,gx期望做对(3+1+1+1+1+0)/6 = 7/6题。(相比之下,lc随机就能期望做对11/6题)

    Solution

    单独考虑每道题的贡献,第 (i) 题与第 (i-1) 题正确答案相同的期望为

    [frac{min{a_i,a_{i-1}}}{a_i*a_{i-1}}=frac{1}{max {a_i,a_{i-1}}} ]

    线性扫过去积累贡献就好了

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int Mod=1e8+1;
    int n,A,B,C,st,pre,now;
    db ans;
    template<typename T> inline void read(T &x)
    {
    	T data=0,w=1;
    	char ch=0;
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    	x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    int main()
    {
    	read(n);read(A);read(B);read(C);read(st);pre=st;
    	for(register int i=2;i<=n;++i)now=(1ll*pre*A+B)%Mod,ans+=1.0/(db)(max(pre%C,now%C)+1),pre=now;
    	ans+=1.0/(db)(max(st%C,now%C)+1);
    	printf("%.3f
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Qt 模拟一个导航定位系统
    【编程之美】用C语言实现状态机(实用)
    代码面试之链表
    乾坤合一~Linux设备驱动之USB主机和设备驱动
    乾坤合一~Linux设备驱动之I2C核心、总线以及设备驱动
    乾坤合一~Linux设备驱动之终端设备驱动
    乾坤合一~Linux设备驱动之块设备驱动
    蜕变成蝶~Linux设备驱动之watchdog设备驱动
    蜕变成蝶~Linux设备驱动之按键设备驱动
    蜕变成蝶~Linux设备驱动之DMA
  • 原文地址:https://www.cnblogs.com/hongyj/p/9517386.html
Copyright © 2020-2023  润新知