[NOI2016]旷野大计算

Subtask0

造计算机神题。给一个忠告:珍爱生命,远离旷野大计算......
代码在这里戳我ubuntu

Subtask1

给定\(a,b\);求\(-2a-2b\)数组

熟悉操做环境:\([-(a+b)]<<1\),共\(6\)次操做。函数

Subtask2

给定\(a\);求\(\frac{1}{1+e^{17a}}\)spa

熟悉关键函数及操做:\(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|\)get

最为关键的一档部分分。
首先\(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\)的构造思想以后要反复用到。io

Subtask5

给定二进制数\(a\),把它翻译为十进制数。ast

开始写\(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\)步。

相关文章
相关标签/搜索