zoukankan      html  css  js  c++  java
  • [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 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)步。

  • 相关阅读:
    一起talk C栗子吧(第一百二十六回:C语言实例--statickeyword)
    leetcode:程序猿面试技巧
    学习图像算法阶段性总结 (附一键修图Demo)
    KMP算法具体解释
    数据结构中的7种排序算法
    关于系统首页绘制问题(ext布局+c#后台加入数据)经html输出流输出响应client
    jumpserver 堡垒机环境搭建(图文具体解释)
    Android二维码工具zxing使用
    Oracle对没有主键的表分页
    Mondiran创建连接
  • 原文地址:https://www.cnblogs.com/GuessYCB/p/10753568.html
Copyright © 2011-2022 走看看