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
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
A - Sequence with Digits | GNU C++17 | Accepted | 31 ms | 3600 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;
}