E加密的情书
本人太菜,只会签到
题意:
一个多位数可以通过加密变成个位数,加密方式为:各个位数上的数相加,直到加成个位数
例如:
123 --》 1+2+3=6
现在给出加密后的一串密文
问是否存在连续的自然数数列 l ~ r,加密后就是题目所给的密文
题解:
一开始绕的晕头转向没看明白,后来慢慢捋顺
就是给密文,求原文是什么?但是注意题目要求原文必须是连续的,长度肯定也和密文一样,因为一个数加密成另一个数,一一对应
我们来举一下例子:
比如原文是
19 20 21
加密后就是
1 2 3
原文是:
18 19 20
加密后是:
9 1 2
等等例子
我们可以发现,加密后的文字一般是不出现0的,因为9之后直接就是1,
但是有一种情况除外,那就是原文是0 1 2
加密后还是0 1 2,也就是原文就是0,那密文肯定是0 ,其他不可能出现零,而且9后面就是1,其他数都必须是相连的,不然肯定不存在解
排除所有不是解的情况,那剩下的都成立,那我们直接用a[1]~a[1]+n-1作为原文即可,我们只需要输出任意符合答案即可,我们就输出原文最接近密文本身的情况
看看代码就悟出来了
题意:
#include <cstdio> #include <iostream> using namespace std; int a[1010]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=2;i<=n;i++) { if(a[i]<=9&&a[i]>=2) { if(a[i-1]!=a[i]-1) { cout<<-1; return 0; } } else if(a[i]==1) { if(i==2) { if(a[1]==0)continue; else if(a[1]==9)continue; else { cout<<-1;return 0; } } else if(a[i-1]!=9) { cout<<-1;return 0; } } else { cout<<-1;return 0; } } cout<<a[1]<<" "<<a[1]+n-1; return 0; }