记录编号 40675 评测结果 AAAAAAAAAAAAAA
题目名称 [暑假培训2012] 残酷的数学老师 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 1.212 s
提交时间 2012-07-18 16:09:05 内存使用 0.31 MiB
显示代码纯文本
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("cruel1.in");
ofstream fout("cruel1.out");
int howlong(char s[]){//18上strlen跪怕了
    int i=0;   
    while(s[i]!=0){   
        i++;   
    }
	i--;
    return i;
}
int turn_2(long x,char s[]){//转为二进制
	char number[]={'0','1'};
	const long n=2;
	int i=0;
	while(x){
		s[i]=number[x%n];
		x/=n;
		i++;
	}
	return i-1;
}//结果是倒着的
void chengself(char x[],char y[],int lx,int ly){//x*=y,lx,ly为最大下标
	char h[15009]={0};
	int i,j;
	for(j=0;j<=ly;j++){ 
		for(i=0;i<=lx;i++){
			h[i+j]+=x[i]*y[j];
			h[i+j+1]+=h[i+j]/10;
			h[i+j]%=10;
		}
    }
	for(i=0;i<=lx+ly+2;i++) x[i]=h[i];
	return;
}//可改为h=x*y
void sqare(char x[],int lx){//x平方
	char h[15009]={0};
	int i,j;
	for(j=0;j<=lx;j++){
		for(i=0;i<=lx;i++){
			h[i+j]+=x[i]*x[j];
			h[i+j+1]+=h[i+j]/10;
			h[i+j]%=10;
		}
    }
	for(i=0;i<=lx+lx+2;i++) x[i]=h[i];
	return;
}
void turnround(char ch[],int n){
	int i;
	char temp;
	for(i=0;i*2<=n;i++){
		temp=ch[i];
		ch[i]=ch[n-i];
		ch[n-i]=temp;
	}
	return;
}
void output(char ch[],int n){//这蛋疼的输出
	int i; 
	for(i=0;i<=n;i++){
		fout<<(int)ch[n-i];
		if(i%70==69) fout<<endl;//不说啥了
	}
	return;
}
int main(){
	int lcheck,lans,lnow;
	char ans[15009]={1},now[15009]={0};
	long p;
	fin>>now>>p;
	char check[22]={0};
	lcheck=turn_2(p,check);
	int i=0;
	lans=0;
	lnow=howlong(now);
	turnround(now,lnow);
	for(i=0;i<=lnow;i++) now[i]-='0';
	for(i=0;i<=lcheck;i++){
		if(check[i]=='1'){//乘啊魂淡
			chengself(ans,now,lans,lnow);
			lans=lans+lnow;
			if(ans[lans+1]!=0) lans++;
		}
		sqare(now,lnow);
		lnow=lnow*2;
		if(now[lnow+1]!=0) lnow++;
	}
	output(ans,lans);
	fin.close();
	fout.close();
	return 0;
}