BZOJ2134: 單選錯位
阿新 • • 發佈:2017-11-05
pre 裸題 borde bbs pro scrip 語句 技術分享 pan
Submit: 1003 Solved: 773
[Submit][Status][Discuss]
2134: 單選錯位
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1003 Solved: 773
[Submit][Status][Discuss]
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的含義見題目描述。
Output
輸出一個實數,表示gx期望做對的題目個數,保留三位小數。
Sample Input
3 2 0 4 1Sample Output
1.167
思路{
簡單的期望$DP$裸題。
首先發現相鄰的點答案正確的唯一情況就是$a_i=a_{i+1}$。
那麽概率是$P=\dfrac{min(a_i,a_{i+1})}{a_i*a_{i+1}}=\dfrac{1}{max(a_i,a_{i+1})}$。
由於任意相鄰的情況不相互影響,滿足期望的線性性質,直接累加過去就可以了。
}
#include<bits/stdc++.h> #define LL long long #define RG register #define il inline #define N 10000010 #define db double using namespace std; int a[N],A,B,C,n; int main(){ scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1); for (RG int i=2;i<=n;i++) a[i] = ((long long)a[i-1] * A + B) % 100000001; a[1]=a[1]%C+1; db ans=0; for(int i=2;i<=n;i++){ a[i]=a[i]%C+1; ans+=1.0/(max(a[i],a[i-1])); }ans+=1.0/(max(a[n],a[1])); printf("%.3lf",ans); }
BZOJ2134: 單選錯位