#include <cstdio>
#include <cstring>
#include <malloc.h>
#define radix (1u<<28)
#define drdx (radix-1)
#define max_size 100000000u
typedef unsigned int qt;
typedef qt ul;
inline qt max(qt a,qt b){ return ((-((a-b)>>31))&(b-a))+a; }
inline qt min(qt a,qt b){ return ((-((a-b)>>31))&(a-b))+b; }
struct bigint{
qt *d;
qt s,l;
};
template<class T> inline void alc ( T* &p, ul l ){
p=(T*)malloc( l * sizeof(T) );
}
template<class T> inline void palc( T* f, T* &t, ul l, ul a ){
if(t) free(t),t=NULL;
alc( t, a );
memcpy( t, f, sizeof(T) * l );
memset( t+l, 0, sizeof(T) * (a-l) );
}
template<class T> inline void palc( T* &t, ul a ){
if(t) free(t),t=NULL;
alc( t, a );
memset( t, 0, sizeof(T) * a );
}
inline void larger(bigint& i){
qt *p=NULL;
palc(i.d,p,i.l,i.s<<1);
i.s<<=1;
free(i.d);
i.d=p;
}
inline qt add(bigint& a,bigint& b){//return carry
qt l=max(a.l,b.l),car=0;
while(a.s<l) larger(a);
a.l=l; qt i=0;
for(;i<l;++i){
if(b.l==i) break;
a.d[i]+=b.d[i]+car;
car=a.d[i]>>28;
a.d[i]&=drdx;
}
for(;i<l;++i){
a.d[i]+=car;
car=a.d[i]>>28;
a.d[i]&=drdx;
}
return car;
}
inline qt sub(bigint& a,bigint& b){//return borrow
qt l=max(a.l,b.l),bor=0;
while(a.s<l) larger(a);
a.l=l; qt i=0;
for(;i<l;++i){
if(b.l==i) break;
a.d[i]-=b.d[i]+bor;
bor=a.d[i]>>31;
a.d[i]+=(-bor)&radix;
}
for(;i<l;++i){
a.d[i]-=bor;
bor=a.d[i]>>31;
a.d[i]+=(-bor)&radix;
}
if(!bor){
while(!a.d[--a.l]);
++a.l;
}
return bor;
}
inline qt mul_basecase(bigint& c,bigint& a,bigint& b){//return carry, c=c+a*b
qt l=a.l+b.l,car=0;
while(c.s<l) larger(c);
for(qt i=0;i<a.l;++i) for(qt j=0,p=i;j<b.l;++j,++p) {
long long nk=(long long)a.d[i]*b.d[j]+c.d[p];
c.d[p]=nk&drdx;
c.d[p+1]+=nk>>28;
c.d[p+2]+=c.d[p+1]>>28;
c.d[p+1]&=drdx;
}
if(c.d[l-1]) c.l=l; else c.l=l-1;
return c.d[l-1]>>28;
}
inline qt mul_limb(bigint& a,qt limb){
qt car=0;
for(int i=0;i<a.l;++i){
long long nk=(long long)a.d[i]*limb+car;
a.d[i]=nk&drdx;
car=nk>>28;
}
return car;
}
inline qt sqr_basecase(bigint& c,bigint& a){//a speed-up of roughly a half
qt l=a.l+a.l,car=0;
while(c.s<l) larger(c);
for(qt i=0;i<a.l;++i){
qt p=i<<1;
long long nk=(long long)a.d[i]*a.d[i]+c.d[p];
c.d[p]=nk&drdx;
c.d[p+1]+=nk>>28;
c.d[p+2]+=c.d[p+1]>>28;
c.d[p+1]&=drdx;
++p;
for(qt j=i+1;j<a.l;++j,++p) {
long long nk=((long long)a.d[i]*(a.d[j])<<1)+c.d[p];
c.d[p]=nk&drdx;
c.d[p+1]+=nk>>28;
c.d[p+2]+=c.d[p+1]>>28;
c.d[p+1]&=drdx;
}
}
if(c.d[l-1]) c.l=l; else c.l=l-1;
return c.d[l-1]>>28;
}
inline qt mul(bigint& c,bigint& a,bigint& b); //automatically select the algorithm used
inline qt sqr(bigint& c,bigint& a);
inline qt div(bigint& a,bigint& b,bigint& r);
inline bigint empty(qt ofsize){
bigint vt;
vt.l=1; vt.s=ofsize;
vt.d=NULL;
palc(vt.d,vt.s);
return vt;
}
inline bigint copy(bigint p){//obtaining a copy from p
bigint vt=p;
qt* t;
palc(vt.d,t,vt.l,vt.s);
vt.d=t;
return vt;
}
inline void pushCarry(bigint& p,qt car){
if(p.l==p.s) larger(p);
p.d[p.l++]=car;
}
inline void getBigInt_tm1(bigint& p){
scanf("%u",&p.l);
while(p.s<p.l) larger(p);
for(qt i=0;i<p.l;++i) scanf("%u",&p.d[i]);
}
inline void printBigInt_tm1(bigint& p){
printf("Length of BigInt: %u\n Size of BigInt: %u int(s)\n",p.l,p.s);
printf(" %-10d * 2^%-4d",p.d[0],0);
for(qt i=1,v=28;i<p.l;(++i)&3?0:putchar('\n'),v+=28) printf(" + %-10d * 2^%-4d",p.d[i],v);
putchar('\n');
}
inline void makeEmpty(bigint& n){
memset(n.d,0,sizeof(qt)*n.l);
n.l=1;
}
inline void makeIdentity(bigint& n){
memset(n.d,0,sizeof(qt)*n.l);
n.d[0]=1;
n.l=1;
}
inline void transfer(bigint& dest,bigint& src){
while(dest.s<src.l) larger(dest);
memcpy(dest.d,src.d,sizeof(qt)*src.l);
dest.l=src.l;
}
//fast powering error code: -1: result too large
inline int fastPower(bigint& n,qt now){
qt size=n.l*now;
if(size>max_size) return -1;
bigint cs[2],cx;
qt fx=0;
cs[0]=empty(size),cs[1]=empty(size),cx=empty(size);
transfer(cs[0],n);
for(;now;(now>>=1),fx=1-fx){
makeEmpty(cx);
if(now&1){
mul(cx,cs[fx],n);
transfer(n,cx);
}
makeEmpty(cs[1-fx]);
sqr(cs[1-fx],cs[fx]);
}
return 0;
}
inline qt karatsuba_mul(bigint& c,bigint& a,bigint& b);
inline qt toom_3_mul(bigint& c,bigint& a,bigint& b);
inline qt toom_4_mul(bigint& c,bigint& a,bigint& b);
inline qt ss_mul(bigint& c,bigint& a,bigint& b); ////////////Classical part ends.

gjd的更多相关文章

  1. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  2. 用bootstrap实现多张图片手动轮回

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABBoAAAJoCAIAAABHhBX4AAAgAElEQVR4nOzdZXdcV7rg8fmIM2vm3r

  3. C算法编程题(五)“E”的变换

    前言 上一篇<C算法编程题(四)上三角> 插几句话,说说最近自己的状态,人家都说程序员经常失眠什么的,但是这几个月来,我从没有失眠过,当然是过了分手那段时期.每天的工作很忙,一个任务接一个 ...

  4. 自己使用的一个.NET轻量开发结构

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABFCAIAAAAerjlvAAAE2UlEQVR4nO2a3U/bVhiH+bdyPaqpmx

  5. 15、ASP.NET MVC入门到精通——MVC-路由

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Routing(路由) – URL url 作为广泛使用的Web用户接口,需要被重视 好的Url应该满足如下条件: URL应为获取某种资源提 ...

  6. javaweb学习总结(五)——Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  7. Java基础语法

    java基础学习总结——基础语法1 一.标识符

  8. python之路2(基础详解)

    python一切都是对象: 列子:

  9. 数据处理之CoreData

    一.CoreData数据库框架与Sqlite对比 Sqlite: 1.基于C接口, 需要使用sql语句, 代码繁琐 2.在处理大量数据时, 表关系更直观 3.在OC中不是可视化的 CoreData: ...

随机推荐

  1. Sort 整理

    文章.图片参考:http://www.jianshu.com/p/1b4068ccd505?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sour ...

  2. centos6.5yum方式升级内核

    升级内核需要使用elrepo的yum源,在安装yum源之前还需要我们导入elrepo的key,如下:rpm -import https://www.elrepo.org/RPM-GPG-KEY-elr ...

  3. python 二分法查找实例(递归、循环)

    二分法,主要应用于有序序列中,原理是每次查找都将原序列折半,逐渐缩小查找范围的一种算法. 需求 要求在一个有序序列中,例如[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30 ...

  4. 创建为ClickOnce清单签名的.pfx格式数字证书

    ------ 第一步 创建 X.509 证书 ------makecert.exe为证书创建工具.证书创建工具生成仅用于测试目的的 X.509 证书.它创建用于数字签名的公钥和私钥对,并将其存储在证书 ...

  5. Jsp与servlet的区别 1

     Jsp与servlet的区别 2011-12-09 16:27:47 分类: Java 1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识 ...

  6. Lua弱引用table

    弱引用table 与python等脚本语言类似地,Lua也采用了自动内存管理(Garbage Collection),一个程序只需创建对象,而无需删除对象.通过使用垃圾收集机制,Lua会自动删除过期对 ...

  7. Ajax load html page

    jQuery ajax - load() 方法 jQuery Ajax 参考手册 实例 使用 AJAX 请求来改变 div 元素的文本: $("button").click(fun ...

  8. IE禁用Cookie后的session处理

    IE禁用Cookie后解决方案:URL重写 购物车案例<IE禁用Cookie后> 购物界面ShowBook.servlet public void doGet(HttpServletReq ...

  9. Yii2提交表单提示无法验证

    yii2使用gii生成的搜索视图里的表单使用的是get方式,我改为post就提示无法验证,以为是控制器默认访问是get,实际默认是get和post都可以 public function behavio ...

  10. 3步完成chrome切换搜索引擎

    1.打开chrome://settings/,找到搜索 2.点击“管理搜索引擎”,出现弹窗. 增加搜索引擎,三个文本框分别输入:名称.快捷键.地址 3.在新的选项卡中,输入快捷键(如:github), ...