记录编号 |
40675 |
评测结果 |
AAAAAAAAAAAAAA |
题目名称 |
[暑假培训2012] 残酷的数学老师 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}