题目描述
小洛有一个正整数 𝑛n,他会进行若干次下列操作:
- 取出正整数 𝑛 的末位,记作 𝑥;
- 将 𝑥平方之后,保留个位,放于 𝑛 的首位之前(特别地,如果 𝑥 为 0,则不进行该步);
上述两步合计为一次操作。例如有一个正整数 142,它可以进行如下操作:
- 取出末尾的 2,原正整数变为 14;
- 2^2=4,放于 14 首位之前成为 414,第一次操作完成;
- 取出末尾的 4,原正整数变为 41;
- 4^2=16,保留个位的 6,放于 41 的首位成为 641,第二次操作完成;
- 以此类推……
现在小洛想知道,对于一个正整数 𝑛,能否进行不超过 𝑞 次操作让其变为正整数 𝑚。请你帮帮他。
输入格式
输入三个正整数 𝑛,𝑚,𝑞。
输出格式
如果能进行不超过 𝑞 次操作让正整数 𝑛 变为正整数 𝑚,则输出若干行,第 𝑖 行输出一个正整数表示进行第 𝑖次操作后的正整数 𝑛 的值。否则输出一行一个整数 −1。
输入输出样例
输入 #1
123 611 10
输出 #1
912 491 149 114 611
输入 #2
123 231 12345
输出 #2
-1
说明/提示
对于 30% 的数据,保证小洛实际只需要不超过 5
#include<bits/stdc++.h>
using namespace std;int weishu(int n){///求位数int sum=0;while(n!=0){n/=10;sum++;}return sum;
}
long long cifang10(int n){//补0使用(判断第一位放前面)long long mul=1;for(int i=1;i<=n;i++)mul*=10;return mul;
}
int main(){int n,m,q;cin>>n>>m>>q;const int M=m;int a[q+10];for(int i=1;i<=q;i++){//加入n=142int g=n%10;//g=2n-=g;//142-2=140n/=10;//n=14int gf=(g*g)%10;//2*2=4n+=(gf*cifang10(weishu(n)));//重点来了!!!14+(4*1e2)=414 提示(不符合语法)1e2=100 4*100=400,400+14=414if(m==n){//等于M后直接停止break;}//测试//cout<<n;测试// return 0;测试a[i]=n;//、、存储计算过程}if(n!=m)cout<<-1;//bushielse{for(int i=1;i<=q;i++){if(a[i]!=0){cout<<a[i]<<endl;//guocheng过程}if(a[i]==0){//把if注释掉自己看cout<<m;//结果break;}}}return 0;
}
次操作即可得到 𝑚;
对于所有数据,数据保证 1≤𝑛,𝑚≤109,1≤𝑞≤106。