当前位置: 首页 > news >正文

蓝桥杯训练 k进制数的数位交换问题

问题进入

k k k进制数的数位交换问题,就是给出一个 k k k进制的数,求出其中任意两个数位交换后的大小

我们先以十进制数 123 123 123为例,假如交换第一位和第二位变成 213 213 213。那么这两个数之间存在什么关系呢,我们注意到百位上本来是 1 1 1,变成了 2 2 2之后原数就要增加 ( 2 − 1 ) ∗ 100 (2-1)*100 (21)100;十位上本来是 2 2 2,变成 1 1 1之后原数就要增加 ( 1 − 2 ) ∗ 10 (1-2)*10 (12)10。那么再考虑交换前左边的数小于右边的数,就变成了减的较多。总之,拿每一位变化后的数减去变化前的数再乘以该位的权值,不必去考虑谁大谁小,二者相加即是原数变化的值。

我们得出了,假如一个 k k k进制数 n n n n n n是转换为十进制的大小)的第 i i i位和第 j j j位( i i i j j j左边)交换,其数位对应权值分别为 a [ i ] a[i] a[i] a [ j ] a[j] a[j]。那么交换后的十进制 m = ( i − j ) ∗ a [ j ] + ( j − i ) ∗ a [ j ] m=(i-j)*a[j]+(j-i)*a[j] m=(ij)a[j]+(ji)a[j]

其中数位权值数组这样初始化:

int a[maxn];
int P;       //对P取模,因为每一位可能很大
void init(string s,int k){  //k进制的字符串s
    int m=s.size();
    a[m-1]=1;
    for(int i=m-2;i>=0;i--){
        a[i]=(a[i+1]*k)%P;
    }
}

例题解析

题目链接

这道题是我做蓝桥杯练习时碰到的,之前没注意过这类题,第一次我写的是直接交换,每次去求一个串的值,但是只过了一半的测试,超时了。显然数位交换和求字符串值那里超时了。那怎么优化呢?看了网上,才知道要用到上面提到的数位交换后数的大小变化的性质,简单研究了一番,便知道怎么解决这类问题了。写篇博客加深印象,这种题也可能作为 I C P C ICPC ICPC的简单题来出。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string s;
int P;
int a[2010];

void init(){
    int m=s.size();
    a[m-1]=1;
    for(int i=m-2;i>=0;i--){
        a[i]=(a[i+1]*26)%P;  //本来想用快速幂求,但是考虑到最26^2000,只能边乘边模才确保不会溢出
    }
}

int solve(string str){
    int tmp=0;
    for(int i=0;i<str.size();i++){
        tmp=tmp*26+str[i]-'A';
        tmp%=P;
    }
    return tmp;

}
int main()
{
    cin>>s;
    scanf("%d",&P);
    init();
    int flag=1;
    int ans=solve(s);
    if(ans==0){
        flag=0;
        printf("0 0\n");
    }else{
        bool exit=0;
        for(int i=0;i<s.size();i++){
            for(int j=i+1;j<s.size();j++){
                int res=(s[i]-s[j])*a[j]+(s[j]-s[i])*a[i];
                if( (res+ans+P)%P==0 ){
                    printf("%d %d",i+1,j+1);
                    flag=0; exit=1; break;
                }
            }
            if(exit) break;
        }
    }
    if(flag) printf("-1 -1\n");
    return 0;
}

相关文章:

  • 如何激发思考
  • POJ1511 Invitation Cards (最短路+正反向建图)
  • IDA*——迭代加深搜索 (UVa11212)
  • 【Android笔记】Activity涉及界面全屏的方法
  • CTU Open Contest 2019 计蒜客重现补题报告
  • 什么是Wi-Fi?
  • UVa1374 Power Calculus (IDA*)
  • Codeforces Round #624 (Div. 3) D - Three Integers(枚举技巧)
  • Android应用程序使用Google Map
  • 程序员如何提高工作效率
  • Codeforces Round #624 (Div. 3) F - Moving Points(树状数组+去重离散化)
  • Codeforces Round #624 (Div. 3) 解(补)题报告
  • chipmunk物理引擎的基本概念和基本用法
  • STL之list
  • Medusa 3D 我的场景编辑器
  • 【css3】浏览器内核及其兼容性
  • 2017前端实习生面试总结
  • 4. 路由到控制器 - Laravel从零开始教程
  • Codepen 每日精选(2018-3-25)
  • C学习-枚举(九)
  • Java到底能干嘛?
  • mockjs让前端开发独立于后端
  • Promise面试题,控制异步流程
  • Rancher如何对接Ceph-RBD块存储
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SpringBoot几种定时任务的实现方式
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 服务器之间,相同帐号,实现免密钥登录
  • 免费小说阅读小程序
  • 人脸识别最新开发经验demo
  • 说说动画卡顿的解决方案
  • 微服务入门【系列视频课程】
  • 再谈express与koa的对比
  • 【干货分享】dos命令大全
  • 【云吞铺子】性能抖动剖析(二)
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 阿里云移动端播放器高级功能介绍
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (09)Hive——CTE 公共表达式
  • (3)选择元素——(17)练习(Exercises)
  • (70min)字节暑假实习二面(已挂)
  • (a /b)*c的值
  • (C语言)共用体union的用法举例
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (分布式缓存)Redis持久化
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (过滤器)Filter和(监听器)listener
  • (三)模仿学习-Action数据的模仿
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net 8 发布了,试下微软最近强推的MAUI