优化了,没用,求调
#include<bits/stdc++.h>
using namespace std;
class bigint_256 {
public:
short val[25600];
int size;
bigint_256() {
memset(this->val, 0, sizeof(this->val));
}
friend std::istream& operator >>(std::istream &is, bigint_256 &x) { //input
std::string tmp;
is >> tmp;
int len = tmp.length();
for (register int i = 0; i < len; i++)x.val[i] = tmp[len - i - 1] - '0';
x.size = len;
return is;
}
friend std::ostream& operator <<(std::ostream &os, bigint_256 x) { //output
for (register int i = x.size - 1; i >= 0; i--)os << x.val[i];
return os;
}
void operator =(bigint_256 b) {
for (register int i = 0; i < b.size; i++)this->val[i] = b.val[i];
this->size = b.size;
}
bigint_256 operator +(bigint_256 b) {
bigint_256 tmp = b;
short jw = 0;
for (register int i = 0; i <= max(this->size, tmp.size) + 1; i++) {
tmp.val[i] = this->val[i] + b.val[i] + jw;
jw = tmp.val[i] / 10;
tmp.val[i] %= 10;
}
tmp.size = max(this->size, tmp.size) + 1;
while (tmp.val[tmp.size - 1] == 0 && tmp.size > 1)tmp.size--;
return tmp;
}
void operator +=(bigint_256 b) {
short jw = 0;
for (register int i = 0; i <= max(this->size, b.size) + 1; i++) {
this->val[i] += (b.val[i] + jw);
jw = this->val[i] / 10;
this->val[i] %= 10;
}
this->size = max(this->size, b.size) + 1;
while (this->val[this->size - 1] == 0 && this->size > 1)this->size--;
}
bigint_256 operator -(bigint_256 b) {
bigint_256 tmp = b;
short jw = 0;
for (register int i = 0; i <= max(this->size, tmp.size) + 1; i++) {
tmp.val[i] = this->val[i] - b.val[i] + jw;
if (tmp.val[i] < 0)jw = -1;
else jw = 0;
tmp.val[i] = (tmp.val[i] + 1000) % 10;
}
tmp.size = max(this->size, tmp.size) + 1;
while (tmp.val[tmp.size - 1] == 0 && tmp.size > 1)tmp.size--;
return tmp;
}
void operator -=(bigint_256 b) {
short jw = 0;
for (register int i = 0; i <= max(this->size, b.size) + 1; i++) {
this->val[i] -= (b.val[i] + jw);
jw = this->val[i] / 10;
this->val[i] = (this->val[i] + 1000) % 10;
}
this->size = max(this->size, b.size) + 1;
while (this->val[this->size - 1] == 0 && this->size > 1)this->size--;
}
bigint_256 operator *(bigint_256 b) {
bigint_256 tmp;
for (register int i = 0; i < this->size; i++) {
int x = 0;
for (register int j = 0; j < b.size; j++) {
tmp.val[i + j] = this->val[i] * b.val[j] + x + tmp.val[i + j];
x = tmp.val[i + j] / 10;
tmp.val[i + j] %= 10;
}
tmp.val[i + b.size] = x;
}
tmp.size = this->size + b.size + 1;
while (tmp.val[tmp.size - 1] == 0 && tmp.size > 1)tmp.size--;
return tmp;
}
void operator *=(bigint_256 b) {
bigint_256 tmp;
for (register int i = 0; i < this->size; i++) {
int x = 0;
for (register int j = 0; j < b.size; j++) {
tmp.val[i + j] = this->val[i] * b.val[j] + x + tmp.val[i + j];
x = tmp.val[i + j] / 10;
tmp.val[i + j] %= 10;
}
tmp.val[i + b.size] = x;
}
tmp.size = this->size + b.size + 1;
while (tmp.val[tmp.size - 1] == 0 && tmp.size > 1)tmp.size--;
*this=tmp;
}
};
bigint_256 bi,bi2;
int k;
short w[105],w2[105];
int main(){
cin>>bi;
cin>>k;
for(register int i=0;i<k;i++)w[i]=bi.val[i];
memset(bi.val,0,sizeof(bi.val));
for(register int i=0;i<k;i++)bi.val[i]=w[i];
bi2=bi;
int sum=1;
while(1){
bi*=bi2;
bool f=1;
for(register int i=0;i<k;i++)w2[i]=bi.val[i];
for(register int i=0;i<k;i++)
if(w2[i]!=w[i]){
f=0;
goto t;
}
t:{
if(f==1){
cout<<sum;
return 0;
}
sum++;
if(sum>560){
cout<<-1;
return 0;
}
}
memset(bi.val,0,sizeof(bi.val));
for(register int i=0;i<k;i++)bi.val[i]=w2[i];
}
}