a,b:array[0..100000] of longint;
i,j,n,p,k:longint;
m:string;
function pan:boolean;
var i,j,m:longint;
f:boolean;
begin
f:=true;
m:=k div 2;
for i:=1 to m do
if a[i]<>a[k-i+1] then f:=false;
if f then pan:=true else pan:=false;
end;
begin
readln(n);
readln(m);
if n<>16 then begin
for i:=1 to length(m) do
begin
a[length(m)-i+1]:=ord(m[i])-ord(’0’);
b[i]:=ord(m[i])-ord(’0’);
end;
end
else
begin
for i:=1 to length(m) do
begin
case m[i] of
’a’,’b’,’c’,’d’,’e’,’f’: a[length(m)-i+1]:=ord(m[i])+10-ord(’a’);
’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’: a[length(m)-i+1]:=ord(m[i])-48;
end;
case m[i] of
’a’,’b’,’c’,’d’,’e’,’f’: b[i]:=ord(m[i])+10-ord(’a’);
’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’: b[i]:=ord(m[i])-ord(’0’);
end;
end;
end;
k:=length(m);
for p:=1 to 30 do
begin
a[1]:=a[1]+b[1];
for i:=2 to k do
begin
a[i]:=a[i]+b[i]+a[i-1] div n;
a[i-1]:=a[i-1] mod n;
end;
if a[k]>=n then
begin
inc(k);
a[k]:=a[k-1] div n;
a[k-1]:=a[k-1] mod n;
end;
if pan then begin writeln(p);exit; end;
for j:=1 to k do
begin
b[k-j+1]:=a[j];
end;
end;
writeln(’Impossible’);
end.
如题~希望牛们给一个答案~谢谢大家了!
code:
//Simulation
#include<fstream>
#include<iostream>
#include<string>
#define ok true
#define no false
//#define debug
using namespace std;
#define fin cin
#define fout cout
//ifstream fin ("huiwen.in");
//ofstream fout ("huiwen.out");
#ifdef debug
ofstream deb ("huiwen_debug.out");
#endif
long long n;
string m;
long long count_ALU=0;
void input(){
fin>>n>>m;
}
long long ordinate1(char c){
if (c>=’0’&&c<=’9’)
return (int)(c-’0’);
if (c>=’a’&&c<=’z’)
return (int)((c-’a’)+10);
if (c>=’A’&&c<=’Z’)
return (int)((c-’A’)+10);
}
char ordinate2(long long k){
if (k<10)
return (char)(k+’0’);
if (k>=10)
return (char)(k+’a’-10);
}
long long change1(string s){
long long base=1,decbase=0;
for (int i=s.size()-1;i>=0;i--){
decbase+=base*ordinate1(s.at(i));
base*=n;
}
return decbase;
}
string change2(long long k){
string nbase="";
long long f=k;
while (f){
nbase.insert(0,1,ordinate2(f%n));
f/=n;
}
return nbase;
}
/*
long long change3(long long k){
int set[256],index=0;
long long f=k,result=0;
while (f){
set[index++]=f%10;
f/=10;
}
// for (int i=0,j=index-1;i<j;i++,j--){
// int temp;
// temp=set[i];
// set[i]=set[j];
// set[j]=temp;
// }
for (int i=0;i<index;i++)
result=result*10+set[i];
return result;
}
*/
string change4(string s){
string rotated=s;
for (int i=0,j=rotated.size()-1;i<j;i++,j--){
char temp;
temp=rotated[i];
rotated[i]=rotated[j];
rotated[j]=temp;
}
#ifdef debug
deb<<"c4 rotated: "<<rotated<<endl;
#endif
return rotated;
}
void huiwens(){
while (count_ALU<30){
long long value1,value2;
bool isok=ok;
string m2;
#ifdef debug
deb<<" m: "<<m<<endl;
#endif
value1=change1(m);
#ifdef debug
deb<<"value1: "<<value1<<endl;
#endif
m2=change4(m);
#ifdef debug
deb<<" m2: "<<m2<<endl;
#endif
value2=change1(m2);
#ifdef debug
deb<<"value2: "<<value2<<endl;
#endif
m=change2(value1+value2);
#ifdef debug
deb<<" m: "<<m<<endl;
#endif
for (int i=0,j=m.size()-1;i<j;i++,j--)
if (m[i]!=m[j]){
isok=no;
break;
}
count_ALU++;
if (isok) break;
}
}
void output(){
if (count_ALU==30)
fout<<"Impossible";
else fout<<count_ALU;
}
int main (void){
input();
huiwens();
output();
return 0;
}
Var
a, b : array [0..10000] of integer;
t : string;
n, m, i : integer;
f : boolean;
step, l : longint;
//===================main========================
Begin
readln(n);
readln(t);
step := 0;
l := length(t);
If ( n <> 16) then For i := l downto 1 do a[i] := ord(t[l+1-i]) - 48
else Begin
For i := l downto 1 do
If (t[l+1-i] >= ’0’) and (t[l+1-i] <= ’9’) then a[i] := ord(t[l+1-i]) - 48
else a[i] := ord(t[l+1-i]) - 55;
End;
While (step <= 30) do
Begin
f := true;
For i := 1 to ((l+1) div 2) do
If (a[i] <> a[l+1-i]) then Begin
f := false;
break;
End;
If f then Begin
writeln(step);
close(Input);
close(Output);
exit;
End
else Begin
For i := 1 to l do b[i] := a[i];
For i := 1 to l do
Begin
b[i] := b[i] + a[l+1-i];
b[i+1] := b[i+1] + (b[i] div n);
b[i] := b[i] mod n;
End;
If (b[l+1] <> 0) then inc(l);
For i := 1 to l do a[i] := b[i];
inc(step);
End;
End;
If (step > 30) then writeln(’Impossible’);
End.