Pagini recente » Cod sursa (job #778695) | Cod sursa (job #2627584) | Cod sursa (job #627303) | Cod sursa (job #2610078) | Cod sursa (job #915581)
Cod sursa(job #915581)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
#define Nmax 1000000
char s[Nmax];
typedef short int BigNumber[Nmax];
BigNumber A, B, C;
void citire(){
ifstream f("sarpe.in");
f.getline( s, Nmax );
for ( int i = strlen( s ) - 1; i >= 0; i-- )
A[ ++A[0] ] = s[i] - 48;
f.close();
}
void afis(BigNumber a){
ofstream g("sarpe.out");
for(int i = a[0]; i; i--)
cout << a[i];
cout << endl;
g.close();
}
void inmul(int x, BigNumber a){
int T = 0;
for ( int i = 1; i <= a[0]; i++ )
a[i] = a[i] * x + T,
T = a[i] / 10,
a[i] %= 10;
while ( T )
a[ ++a[0] ] = T % 10,
T /= 10;
}
void scadere(BigNumber a, BigNumber b){
int T = 0;
for ( int i = 1; i <= a[0]; i++ ){
a[i]=a[i]-(b[i]+T);
if (a[i]<0) T=1; else T=0;
if (T) a[i]+=10;
}
while ( !a[ a[0] ] )
a[0]--;
}
void inmultire(BigNumber a, BigNumber b, BigNumber c){
int T = 0;
c[0] = a[0] + b[0] - 1;
for ( int i = 1; i <= a[0]; i++ )
for ( int j = 1; j <= b[0]; j++ )
c[ i + j - 1 ] += a[i] * b[j];
for ( int i = 1; i <= c[0]; i++ )
T = ( c[i] += T ) / 10,
c[i] %= 10;
if (T)
c[ ++c[0] ] = T;
}
void aduna(int x, BigNumber a){
int T = 0;
for ( int i = 1; i <= a[0]; i++, x /= 10 )
a[i] += T + x,
T = a[i] / 10,
a[i] %= 10;
while( T )
a[ ++a[0] ] = T % 10,
T /= 10;
}
void copiaza(BigNumber a, BigNumber b){
a[0] = b[0];
for ( int i = 0; i <= a[0]; i++ )
a[i] = b[i];
}
void rezolva(){
if( A[0] == 1 && A[1] == 1 ){
ofstream g("sarpe.out");
g << "2\n";
g.close();
return;
}
copiaza(B, A);
inmultire(A, A, C);
inmul(2, B);
inmul(2, C);
scadere(C, B);
aduna(4, C);
afis(C);
}
int main(){
citire();
rezolva();
return 0;
}