第一篇黑题题解祭
我看到这个题目很懵逼,这道题是干嘛的。
当我下载了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(n−1)F(n),C=F(n−1)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+3n−1)
还是那句话: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×(n−1)
第二问:对于每一个 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(n−1)2(2n−1)(2n2−2n+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(n−1)(n−2)(2n−1)(7n−3)
第四个:
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(n−1)2(n−2)(3n−1)
第五个:
1 24 n 4 ( n − 1 ) ( n − 2 ) ( n − 3 ) \frac{1}{24}n^4 (n-1) (n-2) (n-3) 241n4(n−1)(n−2)(n−3)
第六个:
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(n−1)(n−2)(3n2−6n+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(n−1)(n−2)(n−3)(5n2−9n+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(n−1)2(2n−1)(5n2−5n+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(n−1)2(n−2)(2n−1)
第十个:
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(n−1)2(n−2)(n−3)(2n−3)
交给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文件提交上去就行了。
点击提交评测就可以交上去了
谢谢大家