乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。
众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象。
这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?
注意:
1.如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
2.如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a + L次幂的最后k位都相同。
如果知道后I位的循环节为len 那么后i+1位的循环节,就是X^len,X^2*len,X^3*len…直到和X相同,就是后i+1位循环节,需要高精度
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1e4;
char s[maxn];
int k;
struct BigInt{
int len,a[maxn];
void clear(){
len = 0;memset(a,0,sizeof(a));
}
void read(char *S){
clear();
len = strlen(s);
for(int i = 1 ;i <= k ;i++) a[i] = (int)(s[len-i]-'0');
}
void out(){
// cout <<"nei = "<<len<<endl;
for(int i = len ; i>=1;i--) printf("%d",a[i]);
if(len == 0)printf("0");
printf("\n");
}
}B,C,Alen;
BigInt Plus(BigInt A,BigInt B){
BigInt C=A;C.len = max(C.len,B.len)+1;
for(int i = 1; i <= B.len ;i++) C.a[i] += B.a[i];
for(int i = 1; i < C.len ; i++) C.a[i+1] += C.a[i]/10,C.a[i]%=10;
while(C.len > 0 && C.a[C.len] == 0) C.len--;
return C;
}
BigInt Mul(BigInt A,BigInt B,int pp){
BigInt C;C.clear();C.len=A.len+B.len;
for(int i = 1; i <= A.len;i++)
for(int j = 1; j <= B.len ;j++){
if(i+j-1 > k && pp) continue;
C.a[i+j-1]+=A.a[i]*B.a[j];
}
for(int i = 1; i <= (pp==1?k:C.len-1); i++){
// cout << C.len;
C.a[i+1]+=C.a[i]/10,C.a[i]%=10;
}
if(pp) C.a[k+1]=0;
while(C.len > 0 && C.a[C.len] == 0) C.len--;
//cout <<"Clen = "<<C.len<<endl;;
return C;
}
BigInt Minus(BigInt A,BigInt B){
BigInt C=A;
for(int i = 1; i <= C.len ; i++){
C.a[i] -= B.a[i];
while(C.a[i] < 0){
C.a[i]+=10;
C.a[i+1]--;
}
}
while(C.len > 0 && C.a[C.len] == 0) C.len--;
return C;
}
BigInt Is(int tnum){
int num = tnum;
BigInt AA;AA.clear();AA.len = 0;
while(num>0){
AA.a[++AA.len] = num%10;
num/=10;
}
return AA;
}
BigInt pow(BigInt A,BigInt B){
BigInt n1 = Is(1),tmp = A;
while(1){
B = Minus(B,n1);
if(B.len == 0)break;
tmp = Mul(tmp,A,1);
}
return tmp;
}
void sov(){
Alen.a[1] = 1;Alen.len = 1;
BigInt S,tmp=B;
C=pow(B,Alen);
//C.out();
for(int i = 1; i <= k ; i++){
S=B;
//S.out();
int flag = 0;
for(int j = 1; j <= 11 ; j++){
S = Mul(S,C,1);
//cout <<"S - ";
//S.out();
if(S.a[i]==B.a[i]){
Alen = Mul(Alen,Is(j),0);
flag= 1;
C = pow(tmp,Is(j));
tmp = C;
break;
}
}
if(flag == 0){
printf("-1\n");
return;
}
}
Alen.out();
}
void init(){
scanf("%s%d",s,&k);
B.read(s);
C.clear();Alen.clear();
sov();
}
int main(){
init();
}