在做这个题时,发现通过率好像不是很高,觉得有必要发表一下自己的题解
题目来源
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)