Sample Output
38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087
分析:数值为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;}Sample Input
新闻热点
疑难解答