djwcb【算法赛】小白入门赛第8场(C语言)

在做这个题时,发现通过率好像不是很高,觉得有必要发表一下自己的题解

题目来源

3.djwcb【算法赛】 - 蓝桥云课 (lanqiao.cn)

问题描述

输入格式

输出格式

我把这道题目看成是一道较为复杂的模拟题,为什么这么说呢,请看下文讲解

题目分析

1.从输入的数据量来看,很明显p会溢出(c语言),又是乘方,所以说要模拟

char p[200005];

2.此时我们要找出一个规律来模拟这个问题,这个或许也就是算法美的地方(这应该也配算一个算法)

int xmod[15]; //用来存储,后面模拟规律用

可能还不太懂我在说什么,现在很关键

我们要找到mod%10,即我们可以只算末数相乘,不会影响最后结果,接着由于这样的一个道理可知相乘时一个数必定是一个定值x%10,现在只要等着出现另一个值的第二次出现

int index=x%10;
xmod[0]=index;     //xmod[]开始起作用
int k=1;
int temp=-1;      //因为不会等于这个数
while(xmod[0]!=temp){
   temp=index*x%10;
   xmod[k]=temp;  
   index=temp;
   k++;
 }
k--;             //得到周期

3.转化成一个除法模拟,用p来找到合适的值

第二个关键点

p此时便是成了几次,又有了前面得到的规律,我们可以通过求取余数即为第几个来得到相应的值,由于数据会有过大的时候,这里便有了一个因地制宜的除法模拟

int rest=0;
for(int i=0;i<strlen(p);i++){
    rest=p[i]-'0'+rest*10;
    if(rest>=k){
      rest=rest%k;
    }
}

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  int t;
  long long int x;
  char p[200005];
  int xmod[15];
  scanf("%d",&t);
  for(int i=0;i<t;i++){
    scanf("%lld%s",&x,p);
    int index=x%10;
    xmod[0]=index;
    int k=1;
    int temp=-1;
    while(xmod[0]!=temp){
      temp=index*x%10;
      xmod[k]=temp;
      index=temp;
      k++;
    }
    k--;
    int rest=0;
    for(int i=0;i<strlen(p);i++){
      rest=p[i]-'0'+rest*10;
      if(rest>=k){
        rest=rest%k;
      }
    }
    if(rest!=0)
    printf("%d\n",xmod[rest-1]);
    else
    printf("%d\n",xmod[k-1]);
  }
  return 0;
}

由于时间问题可能有的地方没润色到位,但应该有不少小伙伴想知道如何写,有必要后期会有所修改

本文截图来源于蓝桥杯2.二进制王国【算法赛】 - 蓝桥云课 (lanqiao.cn)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值