Description
Input
Output
Sample Input
1279Sample Output
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087
分析:数值为n的数的位数为log10(n)+1,所以2^p-1的位数为p*(log10(2))+1,另外其求出其前五百位的值,因为p的数值较大,所以采用分治的算法来求2^p,2^p = 2^(p/2)*2(p/2)*f(p),p%2==0,f(p)=0;p%2==1,f(p)=2。由此求得2^p。
参考代码:
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 520;
int p;
int digit;
int num[maxn];
int tmp[maxn*2];
void solve( int n)
{
if( n == 0)
return;
solve(n/2);
for( int i = 1; i <= 500; i++)
{
for( int j = 1; j <= 500; j++)
{
if( n%2 == 0)
tmp[i+j-1] += num[i]*num[j];
else
tmp[i+j-1] += num[i]*num[j]*2;
}
}
for( int i = 1; i <= 500; i++)
{
num[i] = tmp[i]%10;
tmp[i+1] += tmp[i]/10;
}
memset(tmp,0,sizeof(tmp));
}
int main()
{
while( ~scanf("%d",&p) && p)
{
digit = (int)(p*log10(2))+1;
memset(num,0,sizeof(num));
memset(tmp,0,sizeof(tmp));
printf("%d\n",digit);
num[1] = 1;
solve(p);
for( int i = 500; i >= 2; i--)
{
printf("%d",num[i]);
if( i%50 == 1)
putchar(10);
}
printf("%d\n",num[1]-1);
}
return 0;
}