首页 > 其他分享 >压位高精模板

压位高精模板

时间:2023-01-30 14:55:45浏览次数:59  
标签:tmp bignum int 压位 dat -- 高精 const 模板

struct bignum{
	ll dat[150];
	bignum() {memset(dat,0,sizeof(dat));dat[0]=1;}
	void print(){
		printf("%ld",dat[dat[0]]);
		for(register int i=dat[0]-1;i>=1;--i)
			printf("%04ld",dat[i]);
	}
	bool operator ==(const bignum &a)const{
		for(register int i=0;i<=dat[0];++i)
			if(dat[i]!=a.dat[i])
				return false;
		return true;
	}
	bool operator <(const bignum &a)const{
		if(dat[0]>a.dat[0]) return false;
		if((*this)==a) return false;
		if(dat[0]<a.dat[0]) return true;
		for(register int i=dat[0];i>=1;--i){
			if(dat[i]>a.dat[i]) return false;
			if(dat[i]<a.dat[i]) return true;
		}
		return true;
	}
	bignum operator *(const int &a)const{
        bignum tmp;
        tmp.dat[0]=dat[0];
        int laz=0;
        for(register int i=1;i<=tmp.dat[0];++i){
            tmp.dat[i]=dat[i]*a+laz;
            laz=tmp.dat[i]/base;
            tmp.dat[i]=tmp.dat[i]%base;
        }
        for(;laz;){
            tmp.dat[++tmp.dat[0]]=laz%base;
            laz/=base;
        }
        for(;!tmp.dat[tmp.dat[0]]&&tmp.dat[0]>1;) tmp.dat[0]--;
        return tmp;
    }
    bignum operator /(const int &a)const{
    	bignum tmp;
    	tmp.dat[0]=dat[0];
    	int laz=0;
    	for(register int i=tmp.dat[0];i>=1;--i){
    		tmp.dat[i]=(laz*base+dat[i])/a;
    		laz=(laz*base+dat[i])%a;
		}
		for(;!tmp.dat[tmp.dat[0]]&&tmp.dat[0]>1;) tmp.dat[0]--;
		return tmp;
	}
	bignum operator +(const bignum &a)const{
		bignum tmp;
		tmp.dat[0]=max(a.dat[0],dat[0]);
		for(register int i=1;i<=tmp.dat[0];++i){
			tmp.dat[i]+=dat[i]+a.dat[i];
			tmp.dat[i+1]+=tmp.dat[i]/base;
			tmp.dat[i]%=base;
		}
		if(tmp.dat[tmp.dat[0]+1]) tmp.dat[0]++;
		return tmp;
	}
	bignum operator -(const bignum &a)const{
		bignum tmp;
		tmp.dat[0]=dat[0];
		int tag=0;
		for(register int i=1;i<=dat[0];++i){
			tmp.dat[i]=dat[i]-a.dat[i]-tag;
			if(tmp.dat[i]<0){
				tmp.dat[i]+=base;
				tag=1;
			}
			else tag=0;
		}
		for(;!tmp.dat[tmp.dat[0]]&&tmp.dat[0]>1;) tmp.dat[0]--;
		return tmp;
	}
	bignum operator *(const bignum &a)const{
		bignum tmp;
		int len=dat[0]+a.dat[0];
		for(register int i=1;i<=dat[0];++i)
			for(register int j=1;j<=a.dat[0];++j){
				tmp.dat[i+j-1]+=dat[i]*a.dat[j];
				tmp.dat[i+j]+=tmp.dat[i+j-1]/base;
				tmp.dat[i+j-1]=tmp.dat[i+j-1]%base;
			}
		for(;!tmp.dat[len]&&len>1;) --len;
		tmp.dat[0]=len;
		return tmp;
	}
	bignum operator /(const bignum &a)const{
		bignum tmp1,tmp2;
		int len=dat[0];
		for(register int i=dat[0];i>=1;--i){
			tmp1=tmp1*base;
			tmp1.dat[1]=dat[i];
			int cnt=0;
			while(a<tmp1||tmp1==a){
				cnt++;
				tmp1=tmp1-a;
			}
			tmp2.dat[i]=cnt;
		}
		while(!tmp2.dat[len]&&len>1) --len;
		tmp2.dat[0]=len;
		return tmp2;
	}
	bignum operator % (const bignum &a)const{
		bignum tmp;
		if((*this)<a) return (*this);
		int len=dat[0];
		for(register int i=len;i>=1;--i){
			tmp=tmp*base;
			tmp.dat[1]=dat[i];
			while(a<tmp||tmp==a)
				tmp=tmp-a;
		}
		for(;!tmp.dat[len]&&len>1;) --len;
		tmp.dat[0]=len;
		return tmp;
	}
};

标签:tmp,bignum,int,压位,dat,--,高精,const,模板
From: https://www.cnblogs.com/Rolling-star/p/17075920.html

相关文章

  • 微信开放平台之第三方平台开发,模板小程序如何提交?
    大家好,我是悟空码字今天天气晴朗,阳光普照。因为疫情影响,小羊人的增多,街上放眼望去,人烟稀少。楼下除了几个十一二岁的小男孩在玩耍,也没有像往日老人悠闲打牌、小孩嬉戏那般热......
  • 24种设计模式--策略模式(strategy)、模板模式(template)
    @目录第一部分:策略模式1.定义接口:Game2.实现Game接口:2.1DNF2.2LOL3.引用的上下文:4.测试类4.1测试结果:第二部分:模板模式复用策略模式的代码1.定义钩子(抽象类):2.具体实现类......
  • 【模板】ODT | Old Driver Tree | 珂朵莉树
    postedon2021-04-0220:38:49|under学术|source这个东西本身不常用,但是这个维护连续段的写法很常用。标签:暴力、数据结构、std::set#include<set>template<cla......
  • 搞定物联网定位:UWB高精度定位技术原理与实现
    搞定物联网定位:UWB高精度定位技术原理与实现https://mp.weixin.qq.com/s/18kCIFtKCfSQGoZy4NDLaA搞定物联网定位:UWB高精度定位技术原理与实现原创 刘恒进 腾讯云开发......
  • 模板引用
    ref属性访问底层DOM,对元素直接操作,可以给一个ref属性访问模板引用挂载完成后,可以在this.$refs上访问绑定了ref的domv-for的模板引用是一个数组,但不保证相同顺序函数......
  • django 自定义模板标签
    故事的背景比较复杂,框架用的django,后台用的simpleui,当我在往前端嵌入echarts的时候发现自定义标签返回的list里面的单引号进行了自动转义,变成了&#39; 具体可以参考:ht......
  • C++ 设计模式--模板方法Template Method
    1.定义定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。TemplateMethod使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某......
  • MybatisUtil 模板类
    由于SqlSessionFactory一般只需要创建一次,因此我们可以创建一个工具类来集中创建SqlSession,这样会更加方便一些:publicclassMybatisUtil{//在类加载时就进行创建......
  • 快慢指针-牛客题霸模板速刷(BM6、BM7、BM8)
    快慢指针是指在链表或其他遍历对象中,通过两个相同方向的指针,即快指针和慢指针,以不同的速度遍历,从而实现寻找某个结点的目的。BM6-判断链表中是否有环题解:想象在环形跑道......
  • 模板继承
    我们可以把不容易变动的功能放在父模板中,其他模板只需要继承改模板。举例说明:第一步创建父模板#catpod-parent.yaml.j2apiversion:v1kind:Podmetadata:{%block......