CSP-S 2020 T1 儒略日 挂分计算(非题解)

T1挂了,自测只有10分,废了啊,身败名裂

不过这篇文章的目的是为了计算,如果数据是纯随机均匀分布的,这个东西能得几分

下附考场挂分代码

#include <cstdio>
typedef long long ll;
int T; ll n;
int p[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool R(int A) {
	if (A % 400 == 0) return true;
	if (A % 100 == 0) return false;
	if (A % 4 == 0) return true;
	return false;
}
void work() {
	scanf("%lld", &n);
	if (n <= 2299160) {
		ll A = -4712 + (n / 1461) * 4;
		ll x = n % 1461;
		if (x >= 366) {x -= 366; A++; } // 这里错了,这个大括号应该把后两行括起来
		if (x >= 365) {x -= 365; A++; }
		if (x >= 365) {x -= 365; A++; }
		ll B = 1;
		for (int i = 1; i <= 12; i++) {
			int t = ((A % 4 == 0) && i == 2) ? 29 : p[i];
			if (x >= t) {x -= t; B++; }
			else {B = i; break; }
		}
		if (A <= 0) printf("%lld %lld %lld BC\n", x+1, B, 1-A);
		else printf("%lld %lld %lld\n", x+1, B, A);
		return;
	}
	n -= 2299161;
	n += 287;
	ll A = 1582 + (n / 146097) * 400;
	ll x = n % 146097;
	while (true) {
		ll t = R(A) ? 366 : 365;
		if (x >= t) {x -= t; A++; }
		else break;
	}
	ll B = 1;
	for (int i = 1; i <= 12; i++) {
		int t = (R(A) && i == 2) ? 29 : p[i];
		if (x >= t) {x -= t; B++; }
		else {B = i; break; }
	}
	printf("%lld %lld %lld\n", x+1, B, A);
}
int main() {
	freopen("julian.in", "r", stdin);
	freopen("julian.out", "w", stdout);
	scanf("%d", &T);
	while (T--) work();
}

这个东西会判错所有 15821582 年之前的闰年的 12123131 日。

就连公元前 47134713 那个也挂了,data1 都不能保证对,因此我的最低得分是 00 分呜呜呜

由此可以计算,如果数据是纯随机的,在 rir_i 限制内均匀分布,这东西期望能得几分

正确率=(1出错日期数maxr+1)Q\text{正确率}=(1-\frac{\text{出错日期数}}{\text{maxr}+1})^Q

以下正确率精确到小数点后四位

测试点编号 Q=Q= rir_i\le 出错日期数 正确率
11 10001000 365365 11 0.06480.0648
22 10001000 1000010000 77 0.49650.4965
33 10001000 100000100000 6969 0.50150.5015
44 1000010000 300000300000 206206 0.00100.0010
55 1000010000 25000002500000 15741574 0.00180.0018
66 100000100000 25000002500000 15741574 0.00000.0000
77 100000100000 50000005000000 15741574 0.00000.0000
88 100000100000 1000000010000000 15741574 0.00000.0000
99 100000100000 10000000001000000000 15741574 0.85430.8543
1010 100000100000 365244221425365244221425 15741574 0.99960.9996

故得分的期望约为 29.1929.19

另,似乎这种错法的同学很多,我和一样错误的同学贴贴呜呜呜

2020.11.16 update: 官方数据实际得分30,过了数据点3,9,10,符合预期。