首页 > 其他分享 >YACS 2022年12月月赛 乙组 T2 八进制小数 题解

YACS 2022年12月月赛 乙组 T2 八进制小数 题解

时间:2023-01-12 10:57:54浏览次数:45  
标签:fir 10 int 题解 乙组 -- 125 ans 八进制

纪念一下,两件事。

$1.$ 打 $YACS$ 一年了,时间过得好快啊。

$2.$ 第一次 $AK$ 乙组。

高精板子。$8$ 进制转十进制,很简单。

小数部分第一位的数字乘上 $8^{-1}$,第二位就乘上 $8^{-2}$,以此类推。

加起来就是答案,可是用 $double$ 来算会爆精度,所以用高精。

这道题的重点是如何算 $8^{-i}$,这个数字给的很巧。

我们小学就学过,$8$ 的好朋友是 $125$,这两个数相乘得到的就是 $1000$

现在就要想办法凑 $125$ 出来。$8^{-i}$ 不是很好用高精计算,变成 $\frac{1}{8^i}$

但是一个数除以 $8^i$ 也很难用高精算。

想办法凑出 $10^i$,那么上下同乘 $125^i$ 就可以了。

得到 $\frac{125^i}{1000^i}$,退化成普通高精。

还有一个问题,这个 $125^i$ 加在小数点后第几位?

很简单,拿 $3\times i + 1 - $ 他的位数就行了。

剩下的就很简单了,上代码:

#include <cstring>
#include <iostream>
using namespace std;
char s[510];
int a[1105], b[1105], ans[3005];
int main () {
    a[1100] = 1;
    scanf ("%s", s + 1);
    int len = strlen (s + 1);
    for (int i = 1; i <= len; i ++) {
        for (int j = 1100; j >= 1; j --) a[j] *= 125;
        for (int j = 1100; j >= 1; j --) {
            a[j - 1] += a[j] / 10;
            a[j] %= 10;
        }
        if (s[i] != '0') {
            int t = s[i] - 48, fir;
            for (int j = 1100; j >= 1; j --) b[j] = a[j] * t;
            for (int j = 1100; j >= 1; j --) {
                b[j - 1] += b[j] / 10;
                b[j] %= 10;
                if (b[j] != 0) fir = j;
            }
            int size = 1101 - fir;
            int na = 3 * i + 1 - size, nb = fir;
            while (nb != 1101) {
                ans[na] += b[nb];
                na ++;
                nb ++;
            }
            for (int i = 3000; i >= 1; i --) {
                ans[i - 1] += ans[i] / 10;
                ans[i] %= 10;
            }
        }
    }
    int tmp = 0;
    for (int i = 3000; i >= 1; i --)
        if (ans[i] != 0 && !tmp) tmp = i;
    for (int i = 1; i <= tmp; i ++) cout << ans[i];
    return 0;
}

 

标签:fir,10,int,题解,乙组,--,125,ans,八进制
From: https://www.cnblogs.com/Xy-top/p/17045795.html

相关文章

  • LOJ #535 题解
    问题转化为交换两个数,使排列的逆序对数最少。设交换\(a_i\)和\(a_j\)且\(i<j,a_i>a_j\)。则减小的逆序对数为\[1+\sum_{k=i+1}^{j-1}[a_k<a_i]-[a_k>a_i]+[a_k>a_j]......
  • AT2282 [ABC051C] Back and Forth 题解
    Description在一个平面直角坐标系内,有一点\(A(x_1,y_1)\)和点\(B(x_2,y_2)\)你需要从\(A\)点走到\(B\)点,再走到\(A\)点,再走到\(B\)点,再回到\(A\)点。期间,你......
  • P4198 楼房重建题解
    一道经典的线段树二分应用题目转化:把每个点换成斜率,此时发现,一个点能够被看见,当且仅当他本身就是前缀最大值用线段树维护单点修改,区间询问前缀最大值数量解题思路:要......
  • 2022SWJTU寒假选拔赛1题解
    目录A-马宝の皮颜矩阵I-小幻777J-小幻考考你A-马宝の皮颜矩阵Description给定矩阵\(a[N][M],1\leN·M\le1e5,1\lea[i][j]\le1e5\),求所有相同元素的曼哈顿......
  • 洛谷P6599 「EZEC-2」异或【题解】
    题目大意有\(T\)组数据,每组数据给定两个\(l,n\in\mathbb{N*}\),构造一个长为\(l\),每个元素不超过\(n\)的数组令他为\(a\),要使\[\sum_{i=1}^l\sum_{j=1}^{i-1}a_i\oplu......
  • SYUCT acm第八次限时训练题解
    SYUCTacm第八次限时训练题解MakeitBeautiful题目大意code#include<bits/stdc++.h>usingnamespacestd;constintN=100;inta[N];intb[N];voidsolve()......
  • 【题解】AT3611 Tree MST
    喝,长大了......
  • CF 1581B Diameter of Graph 题解
    题面:给定n个顶点,m条边,任意两点并且最大距离小于k,两个顶点只能连一条边,询问是否能构造出这样的图型思路:1.n=1时进行特判,只有k>1时成立2.m=n(n-1)/2时,是完全图,只有k......
  • 【题解】CF1268C K Integers
    萌新不懂就问,这是什么时代的题啊???思路trick题。首先根据trick可知:先将\([1,k]\)中的数聚在一起再排序是最优的。排序的花费是逆序对数,所以现在的问题是求把\([1,......
  • Codeforces 1278 F Cards 增强版 题解 (斯特林数,推式子)
    原题链接增强版链接增强版中k=1e7为啥网上题解的式子都那么长啊.jpg首先令\(p=\frac1m\)。求某个数的次幂的题通常都是无脑转下降幂:\(x^k=\sum_{i=0}^kS_2(k,i)x^{\u......