30分求调
查看原帖
30分求调
482610
Mortidesperatslav楼主2023/6/29 08:17

优化了,没用,求调

#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];
	}
}
2023/6/29 08:17
加载中...