记录编号 549721 评测结果 AAAAAAAAAA
题目名称 [NOIP 2003]麦森数 最终得分 100
用户昵称 Gravatar锝镆氪锂铽 是否通过 通过
代码语言 C++ 运行时间 0.013 s
提交时间 2020-02-21 16:04:08 内存使用 5.46 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxN=1000;

struct hugenum{
	int s[maxN];
	int size;
	int sign;
	hugenum operator*(hugenum b){
		int i,j;
		hugenum out;
		memset(out.s,0,sizeof(out.s));
		out.sign=sign*b.sign;
		for(i=1;i<=size;i++){
			for(j=1;j<=b.size;j++){
				if(i+j-1>500)break;
				out.s[i+j-1]+=(s[i]*b.s[j]);
			}
		}
		for(i=1;i<maxN;i++){
			if(out.s[i-1]/10>0)
				out.s[i]+=out.s[i-1]/10;
			out.s[i-1]%=10;
		}
		for(i=maxN-1;i>=1;i--)
			if(out.s[i])
				break;
		out.size=i;
		if(out.size>500)out.size=500;
		return out;
	}
	void print(){
		int i,flag=0;
		if(sign==-1)
			printf("-");
		else if(sign==0){
			printf("0");
			return;
		}
		for(i=500;i>=1;i--){
			if(i>size){
				if(i%50==0)
					printf("\n");
				printf("0");
				continue;
			}
			if(i%50==0)
				printf("\n");
			if(flag)
				printf("%d",s[i]);
			else if(s[i])
				printf("%d",s[i]),flag=1;
		}
	}
	void scan(){
		memset(s,0,sizeof(s));
		int i=0,j;
		char in[maxN];
		scanf("%s",in);
		if(in[0]=='-')
			sign=-1,i++;
		else if(in[0]=='0')
			sign=0;
		else
			sign=1;
		size=strlen(in)-i;
		for(j=size;j>0;i++,j--)
			s[j]=in[i]-'0';
	}
};

int mas(){
	freopen("mason.in","r",stdin);
	freopen("mason.out","w",stdout);
	int p,m=0,n=0;
	scanf("%d",&p);
	printf("%d\n",(int)((p*log10(2))+1));
	hugenum ans,base,tmp;
	ans.s[1]=1;ans.sign=1;ans.size=1;
	base.s[1]=2;base.sign=1;base.size=1;
	while(p!=0){
		m++;
		if(p&1){
			n++;
			tmp=ans*base;
			ans=tmp;
		}
		tmp=base*base;
		base=tmp;
		p>>=1;
	}
	//printf("%d\n%d\n",m,n);
	ans.s[1]--;
	//ans.print();
	for(int i=500;i>=1;i--){
		if(i%50==0)printf("\n");
		printf("%d",ans.s[i]);
	}
	return 0;
}

int lol=mas();
int main(void){;}