首页 > 其他分享 >打印1

打印1

时间:2023-08-29 22:12:31浏览次数:32  
标签:__ return int 打印 long BigInt inline

#define BUF_SIZE 33554432
char __buff__[BUF_SIZE];char *__p1__=__buff__,*__p2__=__buff__;
#define getChar (__p1__==__p2__&&(__p2__=(__p1__=__buff__)
		+fread(__buff__,1,BUF_SIZE,stdin),__p1__==__p2__)?EOF:*__p1__++)

高精度,压位每位 \(32768\),除单精,模单精,减高精,其他运算均同时支持高精、单精
不支持负数
单精指小于 \(32768\) 的数,即使是同时支持单精、高精的运算,大于 \(32768\) 的数也需转高精运算

struct BigInt{
#define BASE 32768
#define SIZE 85
	long long a[SIZE];
	inline BigInt(){a[0]=1;}
	inline long long operator [] (const int &pos)const{return a[pos];}
	inline long long &operator [] (const int &pos){return a[pos];}
	inline void clear(){__builtin_memset(a,0,sizeof a);a[0]=1;}
	inline void init(){a[0]=1;}
	inline void operator = (const BigInt &o){__builtin_memcpy(a,o.a,sizeof a);}
	inline void operator = (long long o){
		if(!o) return;
		a[0]=0;
		while(o) a[++a[0]]=o%BASE,o/=BASE;
	}
	inline long long toLL(){
		long long ans=0;
		for(int i=a[0];i;i--) ans=ans*BASE+a[i];
		return ans;
	}
	inline void refresh(){
		for(int i=a[0]+1;i<SIZE;i++) a[i]=0;
		for(int i=1;i<=a[0];i++) a[i+1]+=a[i]/BASE,a[i]%=BASE;
		while(a[a[0]+1]) a[0]++,a[a[0]+1]+=a[a[0]]/BASE,a[a[0]]%=BASE;
		while(!a[a[0]]&&a[0]>1) a[0]--;
	}
	inline BigInt operator + (const BigInt &o){
		BigInt ans;ans=*this;
		for(int i=1;i<=o[0];i++) ans[i]+=o[i];lib::chkMax(ans[0],o[0]);
		ans.refresh();
		return ans;
	}
	inline void operator += (const BigInt &o){
		for(int i=1;i<=o[0];i++) a[i]+=o[i];lib::chkMax(a[0],o[0]);refresh();
	}
	inline BigInt operator + (const long long &o){
		BigInt ans;ans=*this;
		ans[1]+=o;ans.refresh();
		return ans;
	}
	inline void operator += (const long long &o){
		a[1]+=o;refresh();
	}
	inline BigInt operator - (const BigInt &o){
		BigInt ans;ans=*this;
		for(int i=1;i<=o[0];i++){
			ans[i]-=o[i];
			if(ans[i]<0) ans[i]+=BASE,ans[i+1]--;
		}
		ans.refresh();
		return ans;
	}
	inline void operator -= (const BigInt &o){
		for(int i=1;i<=o[0];i++){
			a[i]-=o[i];
			if(a[i]<0) a[i]+=BASE,a[i+1]--;
		}
		refresh();
	}
	inline BigInt operator * (const BigInt &o){
		BigInt ans;ans.clear();
		for(int i=1;i<=a[0];i++)for(int j=1;j<=o[0];j++) ans[i+j-1]+=a[i]*o[j];ans[0]=a[0]+o[0]-1;
		ans.refresh();
		return ans;
	}
	inline void operator *= (const BigInt &o){
		*this=*this*o;
	}
	inline BigInt operator * (const long long &o){
		BigInt ans;ans.clear();ans[0]=a[0];
		for(int i=1;i<=a[0];i++) ans[i]=a[i]*o;ans.refresh();
		return ans;
	}
	inline void operator *= (const long long &o){
		for(int i=1;i<=a[0];i++) a[i]*=o;refresh();
	}
	inline BigInt operator / (const long long &o){
		BigInt ans,copy;ans.clear();copy=*this;
		int back=a[0];
		for(int i=a[0];i;i--) ans[i]=copy[i]/o,copy[i-1]+=(copy[i]%o)*BASE;
		ans[0]=back;ans.refresh();
		return ans;
	}
	inline void operator /= (const long long &o){
		int back=a[0];
		for(int i=a[0];i;i--) a[i-1]+=(a[i]%o)*BASE,a[i]/=o;
		a[0]=back;refresh();
	}
	inline long long operator % (const long long &o){
		return (*this-(*this/o)*o).toLL();
	}
	inline int operator < (const BigInt &b){
		if(a[0]^b[0]) return a[0]<b[0];
		for(int i=a[0];i;i--)if(a[i]^b[i]) return a[i]<b[i];
		return 0;
	}
	inline int operator <= (const BigInt &b){
		if(a[0]^b[0]) return a[0]<b[0];
		for(int i=a[0];i;i--)if(a[i]^b[i]) return a[i]<b[i];
		return 1;
	}
	inline int operator > (const BigInt &b){
		if(a[0]^b[0]) return a[0]>b[0];
		for(int i=a[0];i;i--)if(a[i]^b[i]) return a[i]>b[i];
		return 0;
	}
	inline int operator >= (const BigInt &b){
		if(a[0]^b[0]) return a[0]>b[0];
		for(int i=a[0];i;i--)if(a[i]^b[i]) return a[i]>b[i];
		return 1;
	}
#undef BASE
#undef SIZE
};

标签:__,return,int,打印,long,BigInt,inline
From: https://www.cnblogs.com/suxxsfe/p/17665966.html

相关文章

  • 打印4
    高斯消元需要求逆元:inlineModIntdet(intn,ModInt(*a)[N]){ ModIntans;ans=1; for(inti=1;i<=n;i++){ if(!a[i][i].x){ ans=0-ans; for(intk=i+1;k<=n;k++)if(a[k][i].x){std::swap(a[i],a[k]);gotoCONTINUE;} return{0}; } CONTINUE: ans*=a[i][i]......
  • js 禁止复制打印
    /*NoPrint.jsV1.0CreatedbyPDFAntiCopy.com*/constnoPrint=true;constnoCopy=true;constnoScreenshot=true;constautoBlur=false;if(noCopy){document.body.oncopy=function(){returnfalse};document.body.oncontextmenu=function......
  • 打印图形:三角形、圆形和正方形 - Java编程案例
    目录1.打印三角形2.打印圆形3.打印正方形总结简介:本文将介绍如何使用Java编程语言打印出不同的图形,包括三角形、圆形和正方形。我们将使用嵌套循环和基本的数学计算来实现这些图形的打印。1.打印三角形首先,让我们来打印一个简单的三角形。在代码中,我们使用了一个嵌套的循环来控......
  • 在线CAD中根据图框拆分DWG图纸和转成pdf打印
    前言有的CAD图纸中有许多的图框,用户需要将图纸按图框进行拆分成,或拆分完成再自动转成PDF进行打印,桌面端的CAD软件可以实现,但WebCAD中如何根据图框拆分DWG图纸并转成pdf打印呢? 启动云图开发包Node服务1.要将图纸框选的部分打印成pdf或者保存为dwg文件,就需要使用到云图开发包中......
  • linux: 用-w满足for循环打印序列位数的一致性
    1打印1-100foriin`seq001100`do echo$idone打印效果:2打印001-100如果是要求所有的序列位数必须保持一致的话,则可以用用-w参数foriin`seq-w1100`doecho$idone打印效果:......
  • 剑指Offer 32 - III. 从上到下打印二叉树
    题目链接:剑指Offer32-III.从上到下打印二叉树题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。解法思路:本题在一题的基础上,区分打印方向,加一个bool型的方向变......
  • 剑指Offer 32 - II. 从上到下打印二叉树 II
    题目链接:剑指Offer32-II.从上到下打印二叉树II题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。解法思路:本题与上题的唯一区别就是在输出的时候,要将同一层的数输出在一行,这就意味着你需要知道哪些数是在一行的;这里巧妙的利用求队列......
  • 剑指Offer 32 - I. 从上到下打印二叉树
    题目链接:剑指Offer32-I.从上到下打印二叉树题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。解法思路:本题就是从考察二叉树的层序遍历,直接上代码:代码:/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint......
  • 剑指 Offer 17. 打印从1到最大的n位数(简单)
    题目:classSolution{public:vector<int>printNumbers(intn){vector<int>result;intmax=pow(10,n)-1;//最大n位数的求法for(inti=1;i<=max;i++){result.push_back(i);}returnresul......
  • 剑指Offer 29. 顺时针打印矩阵
    题目链接:剑指Offer29.顺时针打印矩阵题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。解法思路:本题的题意比较简单,也就是螺旋打印矩阵,但是这里面有技巧,使用数组定义好在打印过程中的四个移动方向在遍历的过程中,每次都是在该方向上移动,当移动......