[codeforces 1355A] Sequence with Digits 十进制转换+打表找规律

Codeforces Round #643 (Div. 2)  参与排名人数11475

[codeforces 1355A]   Sequence with Digits   十进制转换+打表找规律

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1355/problem/A

ProblemLangVerdictTimeMemory
A - Sequence with Digits GNU C++17Accepted31 ms3600 KB

看了A题的数据范围,1≤a1≤10^18, 1≤K≤10^16,感觉不可能啊,放在A题,明显难度过大。

但看了看A题的分数,发现与B题一样,都是750,相信了该题的难度。

根据1≤K≤10^16的数据范围,猜测,可能会出现周期性,有就是每隔一些固定的操作,结果会出现重复

对样例进行了模拟

1 4
第1次,1
第2次,1+1*1=2
第3次,2+2*2=6
第4次,6+6*6=42

意犹未尽,继续更多次的模拟
第5次,42+2*4=50
第6次,50+0*5=50
第7次,50+0*5=50


天啊,竟然是会遇到取出的数,最小值是0的情况,换句话说,之后的数据一直不变。

对着下面的样例,进行模拟,希望能遇到取出的数,最小值是0的情况,更好的对上述结果进行验证。

487 7

无奈算功有限,一直未能算到,取出的数,最小值是0的情况,那么打表吧,看看结果是否如所想。

打表代码如下

#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
int b[25],bn;
void f(LL x){//取出十进制上各个位置的数
	bn=0;
	while(x){
		b[++bn]=x%10;
		x/=10;
	}
	sort(b+1,b+1+bn);//将取出的数,自小到大排序
}
int main(){
	int t,i;
	LL k,a;
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld",&a,&k);
		for(i=1;i<k;i++){
			f(a),a+=b[1]*b[bn];//按题意的公式进行计算
			printf("i=%d %lld\n",i,a);//输出打表的数据
		}
	}
	return 0;
}

对应打表代码的输入数据如下

1
487 20

对应打表代码的输出数据如下

i=1 519
i=2 528
i=3 544
i=4 564
i=5 588
i=6 628
i=7 644
i=8 668
i=9 716
i=10 723
i=11 737
i=12 758
i=13 798
i=14 861
i=15 869
i=16 923
i=17 941
i=18 950
i=19 950

看上上述输出数据,明白了,手工算不出的原因(需要计算的次数过多了,大大超出了10次)。

明白了,在处理过程中,一定会遇到取出的数,最小值是0的情况,该题处理起来,就容易多了。

AC代码如下

#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
int b[25],bn;
void f(LL x){//取出十进制上各个位置的数
	bn=0;
	while(x){
		b[++bn]=x%10;
		x/=10;
	}
	sort(b+1,b+1+bn);//将取出的数,自小到大排序
}
int main(){
	int t,i;
	LL k,a;
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld",&a,&k);
		for(i=1;i<k;i++){
			f(a),a+=b[1]*b[bn];//按题意的公式进行计算
			if(!b[1])break;//找到了取出的数,最小值是0的情况
		}
		printf("%lld\n",a);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值