Subtask0
造计算机神题。给一个忠告:珍爱生命,远离旷野大计算......
代码在这里:戳我
Subtask1
给定(a,b);求(-2a-2b)。
熟悉操作环境:([-(a+b)]<<1),共(6)次操作。
Subtask2
给定(a);求(frac{1}{1+e^{17a}})。
熟悉关键函数及操作:(s(-((a<<4)+a))),共(6)次操作。
Subtask3
给定(a),求(fu(a)),其中(fu(a) = {-1,0,1})。
可以发现(s(x))在(x o infty)时( o 1),在(x o -infty)时( o 0)。
所以通过放缩就能够实现正、(0)、负数的区分了,即([s(a<<500)-0.5]<<1),共(6)次操作。
Subtask4
给定(a);求(|a|)。
最为关键的一档部分分。
首先(s'(x)=frac{e^{-x}}{(1+e^{-x})^2}),(s'(0)=frac{1}{4}),所以当(x o 0),则(s(x) o frac{x}{4}+frac{1}{2})。
所以考虑用(x o 0)时的(s(x))构造我们需要的值。
考虑(INFs(INFx)=[{INF,x>0},{0,x<0}])。
那么(s(frac{x}{INF}+INFs(INFx))=[{1,x>0},{frac{x}{4INF}+frac{1}{2},x<0}]),然后对着构造即可。
至于(0)的尴尬处境,通过加(eps)解决,令(b=a+eps)。
操作为:(-8INF([s(frac{b}{INF}+4INFs(INFb))]-frac{1}{2})+b+4INFs(INFb)),共(14)次操作。
这个(Subtask)的构造思想之后要反复用到。
Subtask5
给定二进制数(a),把它翻译为十进制数。
开始写(for):对后(31)位模拟即可(第(32)位直接取),共(95)次操作。
Subtask6
给定十进制数(a),把它翻译为二进制数。
核心思想:从高位到低位,把当前数(-2^t),若(ge 0)则为(1),否则为(0)。
与(Subtask3)蜜汁相像啊。先写出一个大概:(s((x-2^t+eps)<<500)>>500)。
然后来卡常,不难发现每次都左移十分浪费,所以预先左移一次即可。
再者第(0)位貌似不需要该操作,直接取当前结果即可,通过卡常共(190)次操作。
Subtask7
给定两个数(a,b);求(a xor b)。
先转为二进制数操作,最后再转回十进制,那么只需要考虑某一位的答案。
考虑支持函数:(f(x={0,1,2})=[{0,x=0,2}{1,x=1}]),然后用(f(x))求答案即可。
不难想到(f(x)=x-s((x-1.5)<<500)<<1)。一共(603)次操作。
Subtask8
给定(a);求(frac{a}{10})。
考虑求(s'(x_0)=frac{1}{10}),然后当(x o x_0),(s(x)=s(x_0)+frac{1}{10}(x-x_0))。
手解可得:(x_0=-ln(frac{3+sqrt{5}}{2})),先各凭本事把(x_0)和(s(x_0))的高精小数搞出来再说。
然后就比较简单了,(s(frac{x}{INF}+x_0)=s(x_0)+frac{x}{10INF})。
所以操作为:([s(x>>500+x_0)-s(x_0)]<<500),共(7)次操作。
Subtask9
给定(a_{1,2...,32});把(a)数组排好序后输出来。
冒泡排序,每次操作:(t=a_i+a_{i+1},a_{i+1}=a_i+max(0,a_i-a_{i+1}),a_i=t-a_{i+1})。
唯一的问题在于实现(f(t)=max(0,t)),应该已经轻车熟路了吧。
一种可行构造:(f(t)=x-4INF(s(frac{t}{INF}+2INFs(INFt))-frac{1}{2})+2INFs(INFt))。
共(2192)次操作。
Subtask10
给定(a,b,c);实现(a imes b \% c)。
分两步,先算(a imes b=t),再算(t\% c)。
第一步龟速乘,先把(b)转化为二进制数,设第(i)位为(b_i)。
我们需要一个函数(f(x,t={0,1})=[{0,t=0},{x,t=1}]),做出(f(x,t))事情就简单了。
注意到(s(-infty) o 0),所以(f(x,t))大概形式为(s(x+INF(t-1))),但这样得不到(x)的值。
再次利用(Sub4)、(Sub8)的那种方法即可。
最终设计出来(f(x,t)=2INF(-t+s(frac{x}{INF}+INF(t-1))<<1))。
然后来实现取模,核心思想类似(Sub6),需要函数(g(x)=[{1,xge 0},{0,x<0}])。
由于(x)是整数域(Z)下的,所以这个就比较简单了,(g(x)=s(INF(x+0.5)))。一共(1493)步。