首页 > 其他分享 >CSP历年复赛题-P1015 [NOIP1999 普及组] 回文数

CSP历年复赛题-P1015 [NOIP1999 普及组] 回文数

时间:2024-05-20 12:40:37浏览次数:25  
标签:&& P1015 res int NOIP1999 size CSP 回文

原题链接:https://www.luogu.com.cn/problem/P1015

题意解读:一个N进制数M,把M正序和M逆序相加,几次之后得到是数是回文数,如果超过30次还无法得到回文数,输出Impossible!。

解题思路:

M最长100位,因此需要高精度,定义数组vector<int> m来存储整数M

注意:16进制中可能存在'a~f''A~F'等字母,需要转换成相应的整数

接下来重复以下过程:

将m正序、逆序对应整数进行相加,对结果是否回文进行判定,如果是回文则输出步数

如果重复30次还无法得到回文,输出Impossible!

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n;
string s;
vector<int> m;

int main()
{
    cin >> n >> s;
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
            m.push_back(s[i] - '0');
        if(s[i] >= 'a' && s[i] <= 'f')
            m.push_back((s[i] - 'a' + 10));
        if(s[i] >= 'A' && s[i] <= 'F')
            m.push_back(s[i] - 'A' + 10);
    }

    //对m正序和逆序做高精度加法,30步以内
    for(int step = 1; step <= 30; step++)
    {
        vector<int> res;
        int r = 0; //进位
        for(int i = 0; i < m.size(); i++)
        {
            r += m[i] + m[m.size() - 1 - i];
            res.push_back(r % n);
            r /= n;
        }
        if(r) res.push_back(r);

        //判断res是否是回文数
        bool ishw = true;
        for(int i = 0; i < res.size(); i++)
        {
            if(res[i] != res[res.size() - 1 - i])
            {
                ishw = false;
                break;
            }
        }
        if(ishw) 
        {
            cout << "STEP=" << step;
            return 0;
        }
        m = res;
    }
    cout << "Impossible!";
    return 0;
}

 

标签:&&,P1015,res,int,NOIP1999,size,CSP,回文
From: https://www.cnblogs.com/jcwy/p/18201645

相关文章

  • CSP历年复赛题-P1014 [NOIP1999 普及组] Cantor 表
    原题链接:https://www.luogu.com.cn/problem/P1014题意解读:根据z字形遍历,求第n个数。解题思路:根据题意,遍历顺序如下图所示观察得知,第i层的x/y的x+y=i+1,并且如果i是偶数,x从1开始枚举;如果i是奇数,x从i开始枚举100分代码:#include<bits/stdc++.h>usingnamespacestd;in......
  • CSP历年复赛题-P1008 [NOIP1998 普及组] 三连击
    原题链接:https://www.luogu.com.cn/problem/P1008题意解读:将 1,2,…,9共 9个数分成3组,分别组成3个三位数,且使这 3 个三位数构成 1:2:3的比例,枚举所有的组合即可。解题思路:设定三个数a、b、c枚举a,最小123,最大987b=a*2,c=a*3判断b、c是否是三位数,且a、b、c中所......
  • CSP历年复赛题-P1009 [NOIP1998 普及组] 阶乘之和
    原题链接:https://www.luogu.com.cn/problem/P1009题意解读:  利用高精度计算阶乘之和,需要用到高精度乘法(高精度乘低精度)、高精度加法。  首先,思考不利用高精度如何解题,直观方法就是遍历i从1到n,每次乘i得到i的阶乘,然后累加到结果,代码如下:#include<bits/stdc++.h>usingnam......
  • CSP历年复赛题-P1010 [NOIP1998 普及组] 幂次方
    原题链接:https://www.luogu.com.cn/problem/P1010题意解读:输出一个正整数的2的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。解题思路:先看样例,给定整数137,要拆解成2的幂次方之和,先考虑i使得刚好137>=2^i时,i取7,因此2......
  • CSP历年复赛题-P1548 [NOIP1997 普及组] 棋盘问题
    原题链接:https://www.luogu.com.cn/problem/P2241题意解读:要在整个n*m区域计算正方形和长方形的个数,枚举法即可。解题思路:此题枚举的对象是矩形的高i和宽j,高的范围[1,n],宽的范围[1,m],然后计算在n*m区域内有多少个i*j,i==j即属于正方形,i!=j属于长方形。那么,问题就集中在了......
  • csp2023 游记
    2023.10.20(Day0)S1拿了\(68.5\)分,顺利晋级。但是J1只拿了\(60.5\),没了。S2就在自己的学校(而且甚至是我上信息技术课的教室),所以试机了和没试机没有任何区别qwq。在luogu上面打了一下a+b,回顾了一下编译就走了。2023.10.21(Day1)正序开题,发现T1好像是\(5\)个fo......
  • 梦熊四月 csp-s 模拟赛2 T2 排序
    小B想要对一个长为\(n\)的序列\(A\)排序。已知\(A\)中只包含\(0,1,\cdots,n-1\)且对任意\(i\nej\)有\(A_i\neA_j\)且\(n\)为\(2\)的次幂。为了排序,小B只想用以下两种操作:交换相邻的两个位置,也就是说选择\(1\lei\len-1\)并且交换\(A_i,A_{i+1}\)。......
  • P5664 [CSP-S2019] Emiya 家今天的饭
    题意简述有\(n\)种方法和\(m\)种食材,第\(i\)种方法第\(j\)种食材做出来的菜有\(a_{i,j}\)种。有以下限制:至少做一盘菜。每种方法做出来的菜品数至多为\(1\)。所有以第\(i\)种食材做出来的菜品数不超过菜品种数的一半。求方案数。\(n\le100,m\le2\times10^......
  • P9753 [CSP-S 2023] 消消乐
    P9753[CSP-S2023]消消乐这题想到了50pts,想不出来怎么优化了。50pts:考虑枚举子串左端点,模拟操作过程,直接用栈模拟,遇到相同的则删去,如果某个时刻栈为空,那么合法子串数加一。考场上只想到为空的时候可消除,下面的性质才是关键的。因为我们枚举左端点,每次只判断了\([l,r]\)的......
  • P7914 [CSP-S 2021] 括号序列
    P7914[CSP-S2021]括号序列看起来非常复杂的括号题,看到数据范围,大概确定是区间dp,所以我们考虑怎么定义状态。条件非常多,所以二维的状态肯定表示不了,考虑多加一维来定义不同的状态。\(dp_{i,j,0}\):区间形式是***...***的方案数。\(dp_{i,j,1}\):区间形式是(...)的方案数......