大数模板 0
这个板子只能 +
# include <bits/stdc++.h>
using namespace std;
# define db double
# define ll long long
# define Pir pair< int , int >
# define fi first
# define se second
# define pb push_back
# define m_p make_pair
# define inf 0x3f3f3f3f
# define INF 0x3f3f3f3f3f3f3f3f
const int N = 105 ;
const int maxn = 105 ;
int n, k, a[ N] ;
struct Bign {
int n, s[ maxn<< 1 ] ;
Bign ( int t = 0 ) { init ( ) ; s[ 0 ] = t; }
void init ( ) { n = 1 ; memset ( s, 0 , sizeof ( s) ) ; }
void add ( const Bign& a) {
int res = 0 ;
for ( int i = 0 ; i < a. n || i < n; i++ ) {
if ( i < a. n) res += a. s[ i] ;
if ( i < n) res += s[ i] ;
s[ i] = res % 10 ;
res /= 10 ;
}
n = max ( a. n, n) ;
while ( res) {
s[ n++ ] = res % 10 ;
res /= 10 ;
}
}
} dp[ N] [ N] , ONE ( 1 ) ;
int main ( )
{
while ( scanf ( "%d %d" , & n, & k) != EOF )
{
for ( int i = 1 ; i <= n; i ++ ) scanf ( "%d" , & a[ i] ) ;
memset ( dp, 0 , sizeof dp) ;
a[ 0 ] = - 1 ;
dp[ 0 ] [ 0 ] = 1 ;
for ( int i = 1 ; i <= n; i ++ )
{
for ( int j = 1 ; j <= k; j ++ )
{
for ( int x = 0 ; x < i; x ++ )
{
if ( a[ i] > a[ x] )
dp[ i] [ j] . add ( dp[ x] [ j - 1 ] ) ;
}
}
}
Bign ans = 0 ;
ans. init ( ) ;
for ( int i = 1 ; i <= n; i ++ )
ans. add ( dp[ i] [ k] ) ;
for ( int i = ans. n - 1 ; i >= 0 ; i -- )
printf ( "%d" , ans. s[ i] ) ;
printf ( "\n" ) ;
}
return 0 ;
}
大数模板 1
这个板子只能 +、- 、*
# include <bits/stdc++.h>
using namespace std;
const int N = 1005 ;
struct bign
{
int len, s[ N] ;
bign ( ) { memset ( s, 0 , sizeof ( s) ) ; len= 1 ; }
bign ( int num) { * this= num; }
bign ( char * num) { * this= num; }
bign operator = ( int num)
{
char c[ N] ;
sprintf ( c, "%d" , num) ;
* this= c;
return * this;
}
bign operator = ( const char * num)
{
len= strlen ( num) ;
for ( int i= 0 ; i< len; i++ ) s[ i] = num[ len- 1 - i] - '0' ;
return * this;
}
string str ( )
{
string res= "" ;
for ( int i= 0 ; i< len; i++ ) res= ( char ) ( s[ i] + '0' ) + res;
return res;
}
void clean ( )
{
while ( len> 1 && ! s[ len- 1 ] ) len-- ;
}
bign operator + ( const bign & b)
{
bign c;
c. len= 0 ;
for ( int i= 0 , g= 0 ; g|| i< len|| i< b. len; i++ )
{
int x= g;
if ( i< len) x+= s[ i] ;
if ( i< b. len) x+= b. s[ i] ;
c. s[ c. len++ ] = x% 10 ;
g= x/ 10 ;
}
return c;
}
bign operator - ( const bign & b)
{
bign c;
c. len= 0 ;
int x;
for ( int i= 0 , g= 0 ; i< len; i++ )
{
x= s[ i] - g;
if ( i< b. len) x-= b. s[ i] ;
if ( x>= 0 ) g= 0 ;
else {
x+= 10 ;
g= 1 ;
} ;
c. s[ c. len++ ] = x;
}
c. clean ( ) ;
return c;
}
bign operator * ( const bign & b)
{
bign c;
c. len= len+ b. len;
for ( int i= 0 ; i< len; i++ ) for ( int j= 0 ; j< b. len; j++ ) c. s[ i+ j] += s[ i] * b. s[ j] ;
for ( int i= 0 ; i< c. len- 1 ; i++ ) { c. s[ i+ 1 ] += c. s[ i] / 10 ; c. s[ i] %= 10 ; }
c. clean ( ) ;
return c;
}
bool operator < ( const bign & b)
{
if ( len!= b. len) return len< b. len;
for ( int i= len- 1 ; i>= 0 ; i-- )
if ( s[ i] != b. s[ i] ) return s[ i] < b. s[ i] ;
return false;
}
bign operator += ( const bign & b)
{
* this= * this+ b;
return * this;
}
bign operator -= ( const bign & b)
{
* this= * this- b;
return * this;
}
} ;
istream& operator >> ( istream & in, bign & x)
{
string s;
in>> s;
x= s. c_str ( ) ;
return in;
}
ostream& operator << ( ostream & out, bign & x)
{
out<< x. str ( ) ;
return out;
}
bign ans= "0" ;
bign prime[ 30 ] = { "2" , "3" , "5" , "7" , "11" , "13" , "17" , "19" , "23" , "29" , "31" , "33" , "37" , "41" , "43" } ;
int main ( )
{
char s[ 1000 ] ;
cin >> s;
bign a = 100 ;
bign b = "1000" ;
bign c = s;
cout << a << endl;
cout << b << endl;
cout << c << endl;
bign x = a + b;
bign y = b - a;
bign z = a * b;
cout << x << endl;
cout << y << endl;
cout << z << endl;
return 0 ;
}
大数模板 2
# include <bits/stdc++.h>
using namespace std;
# define ll long long
struct BigInt
{
const static int mod= 10000 ;
const static int LEN= 4 ;
int a[ 800 ] , len;
BigInt ( )
{
memset ( a, 0 , sizeof ( a) ) ;
len= 1 ;
}
void init ( int x)
{
memset ( a, 0 , sizeof ( a) ) ;
len= 0 ;
do
{
a[ len++ ] = x% mod;
x/= mod;
} while ( x) ;
}
void Init ( const char s[ ] )
{
memset ( a, 0 , sizeof ( a) ) ;
int l= strlen ( s) , res= 0 ;
len= l/ LEN;
if ( l% LEN) len++ ;
for ( int i= l- 1 ; i>= 0 ; i-= LEN)
{
int t= 0 , k= max ( i- LEN+ 1 , 0 ) ;
for ( int j= k; j<= i; j++ ) t= t* 10 + s[ j] - '0' ;
a[ res++ ] = t;
}
}
int Compare ( const BigInt & b)
{
if ( len< b. len) return - 1 ;
if ( len> b. len) return 1 ;
for ( int i= len- 1 ; i>= 0 ; i-- )
if ( a[ i] < b. a[ i] ) return - 1 ;
else if ( a[ i] > b. a[ i] ) return 1 ;
return 0 ;
}
BigInt operator + ( const BigInt & b) const
{
BigInt ans;
ans. len= max ( len, b. len) ;
for ( int i= 0 ; i< ans. len; i++ )
{
ans. a[ i] += ( ( i< len) ? a[ i] : 0 ) + ( ( i< b. len) ? b. a[ i] : 0 ) ;
ans. a[ i+ 1 ] += ans. a[ i] / mod;
ans. a[ i] %= mod;
}
if ( ans. a[ ans. len] > 0 ) ans. len++ ;
return ans;
}
BigInt operator - ( const BigInt & b) const
{
BigInt ans;
ans. len= len;
int k= 0 ;
for ( int i= 0 ; i< ans. len; i++ )
{
ans. a[ i] = a[ i] + k- b. a[ i] ;
if ( ans. a[ i] < 0 ) ans. a[ i] += mod, k= - 1 ;
else k= 0 ;
}
while ( ans. a[ ans. len- 1 ] == 0 && ans. len> 1 ) ans. len-- ;
return ans;
}
BigInt operator * ( const BigInt & b) const
{
BigInt ans;
for ( int i= 0 ; i< len; i++ )
{
int k= 0 ;
for ( int j= 0 ; j< b. len; j++ )
{
int temp= a[ i] * b. a[ j] + ans. a[ i+ j] + k;
ans. a[ i+ j] = temp% mod;
k= temp/ mod;
}
if ( k!= 0 ) ans. a[ i+ b. len] = k;
}
ans. len= len+ b. len;
while ( ans. a[ ans. len- 1 ] == 0 && ans. len> 1 ) ans. len-- ;
return ans;
}
BigInt operator / ( const int & n) const
{
BigInt ans;
ans. len= len;
int k= 0 ;
for ( int i= ans. len- 1 ; i>= 0 ; i-- )
{
k= k* mod+ a[ i] ;
ans. a[ i] = k/ n;
k= k% n;
}
while ( ans. a[ ans. len- 1 ] == 0 && ans. len> 1 ) ans. len-- ;
return ans;
}
ll operator % ( const int & n) const
{
ll ans= 0 ;
for ( int i= len- 1 ; i>= 0 ; i-- )
{
ans= ans* mod+ a[ i] ;
if ( ans> n) ans%= n;
}
return ans;
}
void output ( )
{
printf ( "%d" , a[ len- 1 ] ) ;
for ( int i= len- 2 ; i>= 0 ; i-- )
printf ( "%04d" , a[ i] ) ;
printf ( "\n" ) ;
}
} ;
int main ( )
{
BigInt x, y, z;
char s[ ] = "12345" ;
char t[ ] = "111" ;
x. Init ( s) ;
y. Init ( t) ;
z = x + y;
z. output ( ) ;
z = x - y;
z. output ( ) ;
z = x * y;
z. output ( ) ;
return 0 ;
}
大数模板 3
例题传送门
# include <stdio.h>
# include <string.h>
# include <math.h>
# define max ( a, b) ( a) > ( b) ? ( a) : ( b)
# define min ( a, b) ( a) < ( b) ? ( a) : ( b)
const int MAXSIZE = 1005 ;
struct bign {
int s[ MAXSIZE] ;
bign ( ) { memset ( s, 0 , sizeof ( s) ) ; }
bign ( int number) { * this = number; }
bign ( const char * number) { * this = number; }
void put ( ) ;
bign mul ( int d) ;
void del ( ) ;
bign operator = ( char * num) ;
bign operator = ( int num) ;
bool operator < ( const bign& b) const ;
bool operator > ( const bign& b) const { return b < * this; }
bool operator <= ( const bign& b) const { return ! ( b < * this) ; }
bool operator >= ( const bign& b) const { return ! ( * this < b) ; }
bool operator != ( const bign& b) const { return b < * this || * this < b; }
bool operator == ( const bign& b) const { return ! ( b != * this) ; }
bign operator + ( const bign& c) ;
bign operator * ( const bign& c) ;
bign operator - ( const bign& c) ;
int operator / ( const bign& c) ;
bign operator / ( int k) ;
bign operator % ( const bign & c) ;
int operator % ( int k) ;
void operator ++ ( ) ;
bool operator -- ( ) ;
} ;
bign bign:: operator = ( char * num) {
s[ 0 ] = strlen ( num) ;
for ( int i = 1 ; i <= s[ 0 ] ; i++ )
s[ i] = num[ s[ 0 ] - i] - '0' ;
return * this;
}
bign bign:: operator = ( int num) {
char str[ MAXSIZE] ;
sprintf ( str, "%d" , num) ;
return * this = str;
}
bool bign:: operator < ( const bign& b) const {
if ( s[ 0 ] != b. s[ 0 ] )
return s[ 0 ] < b. s[ 0 ] ;
for ( int i = s[ 0 ] ; i; i-- )
if ( s[ i] != b. s[ i] )
return s[ i] < b. s[ i] ;
return false;
}
bign bign:: operator + ( const bign& c) {
int sum = 0 ;
bign ans;
ans. s[ 0 ] = max ( s[ 0 ] , c. s[ 0 ] ) ;
for ( int i = 1 ; i <= ans. s[ 0 ] ; i++ ) {
if ( i <= s[ 0 ] ) sum += s[ i] ;
if ( i <= c. s[ 0 ] ) sum += c. s[ i] ;
ans. s[ i] = sum % 10 ;
sum /= 10 ;
}
return ans;
}
bign bign:: operator * ( const bign& c) {
bign ans;
ans. s[ 0 ] = 0 ;
for ( int i = 1 ; i <= c. s[ 0 ] ; i++ ) {
int g = 0 ;
for ( int j = 1 ; j <= s[ 0 ] ; j++ ) {
int x = s[ j] * c. s[ i] + g + ans. s[ i + j - 1 ] ;
ans. s[ i + j - 1 ] = x % 10 ;
g = x / 10 ;
}
int t = i + s[ 0 ] - 1 ;
while ( g) {
++ t;
g += ans. s[ t] ;
ans. s[ t] = g % 10 ;
g = g / 10 ;
}
ans. s[ 0 ] = max ( ans. s[ 0 ] , t) ;
}
ans. del ( ) ;
return ans;
}
bign bign:: operator - ( const bign& c) {
bign ans = * this;
for ( int i = 1 ; i <= c. s[ 0 ] ; i++ ) {
if ( ans. s[ i] < c. s[ i] ) {
ans. s[ i] += 10 ;
ans. s[ i + 1 ] -- ; ;
}
ans. s[ i] -= c. s[ i] ;
}
for ( int i = 1 ; i <= ans. s[ 0 ] ; i++ ) {
if ( ans. s[ i] < 0 ) {
ans. s[ i] += 10 ;
ans. s[ i + 1 ] -- ;
}
}
ans. del ( ) ;
return ans;
}
int bign:: operator / ( const bign& c) {
int ans = 0 ;
bign d = * this;
while ( d >= c) {
d = d - c;
ans++ ;
}
return ans;
}
bign bign:: operator / ( int k) {
bign ans;
ans. s[ 0 ] = s[ 0 ] ;
int num = 0 ;
for ( int i = s[ 0 ] ; i; i-- ) {
num = num * 10 + s[ i] ;
ans. s[ i] = num / k;
num = num % k;
}
ans. del ( ) ;
return ans;
}
int bign:: operator % ( int k) {
int sum = 0 ;
for ( int i = s[ 0 ] ; i; i-- ) {
sum = sum * 10 + s[ i] ;
sum = sum % k;
}
return sum;
}
bign bign:: operator % ( const bign & c) {
bign now = * this;
while ( now >= c) {
now = now - c;
now. del ( ) ;
}
return now;
}
void bign:: operator ++ ( ) {
s[ 1 ] ++ ;
for ( int i = 1 ; s[ i] == 10 ; i++ ) {
s[ i] = 0 ;
s[ i + 1 ] ++ ;
s[ 0 ] = max ( s[ 0 ] , i + 1 ) ;
}
}
bool bign:: operator -- ( ) {
del ( ) ;
if ( s[ 0 ] == 1 && s[ 1 ] == 0 ) return false;
int i;
for ( i = 1 ; s[ i] == 0 ; i++ )
s[ i] = 9 ;
s[ i] -- ;
del ( ) ;
return true;
}
void bign:: put ( ) {
if ( s[ 0 ] == 0 )
printf ( "0" ) ;
else
for ( int i = s[ 0 ] ; i; i-- )
printf ( "%d" , s[ i] ) ;
}
bign bign:: mul ( int d) {
s[ 0 ] += d;
for ( int i = s[ 0 ] ; i > d; i-- )
s[ i] = s[ i - d] ;
for ( int i = d; i; i-- )
s[ i] = 0 ;
return * this;
}
void bign:: del ( ) {
while ( s[ s[ 0 ] ] == 0 ) {
s[ 0 ] -- ;
if ( s[ 0 ] == 0 ) break ;
}
}
int n, m;
bign dp[ 17 ] , one = 1 ;
void sov ( int n, int m)
{
dp[ 0 ] = 1 ;
for ( int j = 1 ; j <= m; j ++ )
{
dp[ j] = 1 ;
for ( int k = 0 ; k < n; k ++ )
{
dp[ j] = dp[ j] * dp[ j - 1 ] ;
}
dp[ j] = dp[ j] + one;
}
( dp[ m] - dp[ m - 1 ] ) . put ( ) ;
printf ( "\n" ) ;
}
int main ( )
{
while ( scanf ( "%d %d" , & n, & m) && n + m)
{
printf ( "%d %d " , n, m) ;
if ( m == 0 ) printf ( "1\n" ) ;
else sov ( n, m) ;
}
return 0 ;
}