[NOI2016]旷野大计算

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\to \infty\)\(\to 1\),在\(x\to -\infty\)\(\to 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\to 0\),则\(s(x)\to \frac{x}{4}+\frac{1}{2}\)
所以考虑用\(x\to 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\to 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\times b \% c\)

分两步,先算\(a\times b=t\),再算\(t\% c\)
第一步龟速乘,先把\(b\)转化为二进制数,设第\(i\)位为\(b_i\)
我们需要一个函数\(f(x,t=\{0,1\})=[\{0,t=0\},\{x,t=1\}]\),做出\(f(x,t)\)事情就简单了。
注意到\(s(-\infty)\to 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,x\ge 0\},\{0,x<0\}]\)
由于\(x\)是整数域\(Z\)下的,所以这个就比较简单了,\(g(x)=s(INF(x+0.5))\)。一共\(1493\)步。

posted @ 2019-04-22 22:34  GuessYCB  阅读(637)  评论(0编辑  收藏  举报