P4920 【[WC2015]未来程序】题解

25 篇文章 0 订阅
9 篇文章 0 订阅

第一篇黑题题解祭


我看到这个题目很懵逼,这道题是干嘛的。

当我下载了ZIP后,发现有代码。

难不成出题人开始讲武德了?

然后我高兴地将代码运行

  • 1秒过去了

  • 10秒过去了

  • 1分钟过去了

  • 5分钟过去了

你倒是给我出来结果啊!!!

真是“未来程序”啊

果然不讲武德。

所以,这道题我们不能死做,要把它优化输出!


再说一句,既然大家都知道了怎么做,那我就不贴答案了哈。


example

我视而不见,直接弃疗

testdata1

欸,代码要求是 a × b % c a\times b \% c a×b%c 啊,那我们可以用快速幂改一下来做。

python真香

testdata2

粗略地看了一眼。

哎,你取模写那么长是给谁看的啊。

那么A,B,C有什么规律啊?

经过我打表仔细观察发现

F ( n ) F(n) F(n) 为斐波那契数列数列的第 n n n 项,那么,在第 n n n 次循环, A = F ( n ) 2 , B = F ( n − 1 ) F ( n ) , C = F ( n − 1 ) 2 A=F(n)^2,B=F(n-1)F(n),C=F(n-1)^2 A=F(n)2,B=F(n1)F(n),C=F(n1)2

斐波那契数列怎么求?当然是矩阵快速幂辣!

testdata3

小学奥数题。

∑ i = 1 n i = n × ( n + 1 ) 2 \sum^{n}_{i=1}i=\dfrac{n\times(n+1)}{2} i=1ni=2n×(n+1)

∑ i = 1 n i 2 = n × ( n + 1 ) × ( 2 n + 1 ) 6 \sum^{n}_{i=1}i^2=\dfrac{n\times(n+1)\times(2n+1)}{6} i=1ni2=6n×(n+1)×(2n+1)

∑ i = 1 n i 3 = n 2 × ( n + 1 ) 2 4 \sum^{n}_{i=1}i^3=\dfrac{n^2\times(n+1)^2}{4} i=1ni3=4n2×(n+1)2

∑ i = 1 n i 4 = n × ( n + 1 ) × ( 2 n + 1 ) × ( 3 n 2 + 3 n − 1 ) 30 \sum^{n}_{i=1}i^4=\dfrac{n\times(n+1)\times(2n+1)\times(3n^2+3n-1)}{30} i=1ni4=30n×(n+1)×(2n+1)×(3n2+3n1)

还是那句话:python真香!

如果你想用C++,那我们可以用NOIP第一题的想法,先求出gcd,约分后再计算,避免爆掉unsigned long long

testdata4

又是粗略地看了一眼。

原来是一个 01 01 01 矩阵。

第一问:对于每一个 1 1 1 来说,不是它自己的 1 1 1 有多少个,再求和。

很显然,假设有 n n n 1 1 1 ,答案是 n × ( n − 1 ) n\times (n-1) n×(n1)

第二问:对于每一个 1 1 1 ,求距离它最近的 0 0 0 的曼哈顿距离,再求和。

这种问题,我们考虑用DP求解。DP 4 4 4 次,分别是从左上搜到右下,从右上搜到左下,从左下搜到右上,从右下搜到左上。就能搜出来了。

testdata5

又是一个 01 01 01 矩阵。

求的是 01 01 01 矩阵中有多少个全 1 1 1 的子矩阵。

n 6 n^6 n6会炸的,但是我们可以用单调栈优化掉。

testdata6

这个其实就是让你计算 f ( n ) ( t ) f(n)(t) f(n)(t), 其中 f ( t ) = a t 2 + b f(t)=at^2+b f(t)=at2+b

显然,这个函数将来会进入一个环。

我们可以用 Floyd 来判环,但是你想等几个小时吗?

于是,我跑去学 Brent 判环了。

339秒,约合5分半,不亏。

testdata7

我又是粗略一看:

数独的变形?

当然,作为一个懒人,我直接从数独那道题把代码拷了过来。

做好等几秒钟的准备,当然dacing-links可能会快一点。

testdata8

竟然是一道排列组合,这对常年排列组合做不出来的我有很大的困扰……

终于,在重温了一遍排列组合后,我终于做出来了。

第一个:

C n 7 C_{n}^{7} Cn7

第二个:

1 60 n 2 ( n − 1 ) 2 ( 2 n − 1 ) ( 2 n 2 − 2 n + 1 ) \frac{1}{60}n^2(n-1)^2(2n-1)(2n^2-2n+1) 601n2(n1)2(2n1)(2n22n+1)

第三个:

1 360 n 2 ( n − 1 ) ( n − 2 ) ( 2 n − 1 ) ( 7 n − 3 ) \frac{1}{360}n^2(n-1)(n-2)(2n-1)(7n-3) 3601n2(n1)(n2)(2n1)(7n3)

第四个:

1 48 n 3 ( n − 1 ) 2 ( n − 2 ) ( 3 n − 1 ) \frac{1}{48}n^3(n-1)^2(n-2)(3n-1) 481n3(n1)2(n2)(3n1)

第五个:

1 24 n 4 ( n − 1 ) ( n − 2 ) ( n − 3 ) \frac{1}{24}n^4 (n-1) (n-2) (n-3) 241n4(n1)(n2)(n3)

第六个:

1 60 n 3 ( n − 1 ) ( n − 2 ) ( 3 n 2 − 6 n + 1 ) \frac{1}{60}n^3 (n-1) (n-2) (3n^2-6n+1) 601n3(n1)(n2)(3n26n+1)

第七个:

1 360 n 3 ( n − 1 ) ( n − 2 ) ( n − 3 ) ( 5 n 2 − 9 n + 1 ) \frac{1}{360}n^3 (n-1) (n-2) (n-3) (5n^2-9n+1) 3601n3(n1)(n2)(n3)(5n29n+1)

第八个:

1 144 n 2 ( n − 1 ) 2 ( 2 n − 1 ) ( 5 n 2 − 5 n + 2 ) \frac{1}{144}n^2 (n-1)^2 (2n-1) (5n^2-5n+2) 1441n2(n1)2(2n1)(5n25n+2)

第九个:

1 36 n 3 ( n − 1 ) 2 ( n − 2 ) ( 2 n − 1 ) \frac{1}{36}n^3 (n-1)^2 (n-2) (2n-1) 361n3(n1)2(n2)(2n1)

第十个:

1 240 n 2 ( n − 1 ) 2 ( n − 2 ) ( n − 3 ) ( 2 n − 3 ) \frac{1}{240}n^2 (n-1)^2 (n-2) (n-3) (2n-3) 2401n2(n1)2(n2)(n3)(2n3)

交给python就好了。

当然高精度也是可以的。

testdata9

给你十个MD5值并解密。

当然,作为MD5是什么都不知道的我,当然就还是普通地猜谜啦!

第一个:

Q:第一年NOI是什么时候举办的?

A:1984

第二个:

Q:最常见的六位密码?

A:123456

第三个:

Q:开始的大头照是谁?

A:chenlijie

第四个:

Q:在~!@#$%^&*()_+-={}[]\|;:'",<.>/?找三个可见符号。

A:$_$

第五~八个:

Q:一句名言

A:we hold these truths(在第二个程序里有一部伪·英语词典,爆搜即可出来)

第九个:

经过我惨无人道的爆搜,得出结果:to be

第十个:

在我努力思考后,发现,在第十个程序中有:

WE(); HOLD(); THESE(); TRUTHS(); TO(); BE(); SELFEVIDENT()

这个字眼,那么,我们可以发现,答案应该是selfevident

testdata10

嗯?总觉得在哪见过。

哟,这不是历史上著名的独立宣言吗?

出题人你真有时间……

但是我们发现程序的瓶颈在于 A 到 Z 函数,而其他单词调用的次数不多,而 A 到 Z 函数的本质就是若干次 _ 函数,处理就可以啦.

关于提交代码:

提交答案题是将答案放到多个.out文件中,做成zip后上传的。

我给大家演示一下这道题的提交过程:

首先,我们先把各个结果存到10个.out文件里,并命好名,能让评测机一眼看出来哪个是哪个。

然后,再把这些文件压缩到一个.zip文件里。

然后把这个.zip文件提交上去就行了。

点击提交评测就可以交上去了


谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值