高精度模板(从洛谷题解中骗来的
乘法通用模板:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <map> #include <set> #include <queue> #include <list> #include <iterator> #include <cmath> using namespace std; #define lson (l , mid , rt << 1) #define rson (mid + 1 , r , rt << 1 | 1) #define debug(x) cerr << #x << " = " << x << "\n"; #define pb push_back #define pq priority_queue #define Pll pair<ll,ll> #define Pii pair<int,int> #define fi first #define se second #define OKC ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define FT(A,B,C) for(int A=B;A <= C;A++) //用来压行 typedef long long ll; typedef unsigned long long ull; /*-----------------show time----------------*/ using namespace std; const int N=1005; struct int_l{ int data[N]; int_l(){//结构体的初始化 这很关键 memset(data,0,sizeof(data)); data[0]=1; } int_l(int x){//将低精数转化为高精数 memset(data,0,sizeof(data)); data[0]=1; int i=1; while(x){ data[i++]=x%10; x/=10; } data[0]=--i; } int_l operator *(const int &x){//重载乘号 * 注意只能高精*低精 不能 低精*高精 int_l a; int len; a.data[0]=data[0]; FT(i,1,data[0]) a.data[i]=data[i]*x; for(int i=1;i<=a.data[0] || a.data[i];len=++i){ a.data[i+1]+=a.data[i]/10; a.data[i]%=10;} a.data[len]? a.data[0]=len : a.data[0]=--len; return a; } int_l operator +(const int_l &x){//重载加号 + int_l a; a.data[0]=max(data[0],x.data[0]); FT(i,1,a.data[0]) a.data[i]=data[i]+x.data[i]; FT(i,1,a.data[0]){ a.data[i+1]+=a.data[i]/10; a.data[i]%=10;} a.data[a.data[0]+1]? a.data[0]++ : a.data[0]; return a; } }; ostream& operator << (ostream& out, const int_l &x){//这行比较高深 重载输出流 //嫌麻烦的 可以用普通的方法输出也行 FT(i,1,x.data[0]) out<<x.data[x.data[0]-i+1]; return out; } int main(){ int n; OKC; cin>>n; int_l ans(0),a(1); for(int i=1; i<=n; i++) { a = a*i; ans =ans + a; } cout<<ans<<endl; return 0; }
skr