双塔问题

#include <cstdio>
#include <cstring>
const int N=100;
int a[N],t[N],s[N],c1[N];
int n;
void mult (int a[N],int la,int b[N],int lb,int c[N],int &lc){
memset(c1,0,sizeof c1);
//a*b==>c1
for(int i=0;i<la;++i)
for(int j=0;j<lb;++j){
c1[i+j]+=a[i]*b[j];
c1[i+j+1]+=c1[i+j]/10;
c1[i+j]%=10;
}
//处理c1的长度
lc=la+lb;
while(lc>1 and c1[lc-1]==0) lc--;
for(int i=0;i<lc;++i) c[i]=c1[i];
}
int main(){
//freopen("caioj1331.in","r",stdin);
//freopen("caioj1331.out","w",stdout);
scanf("%d",&n);
//调整n
++n;
//把n转成二进制,存到a数组里
int l=0;
while(n>0){
++l;
a[l]=n%2;
n/=2;
}
//初始化t数组
memset(t,0,sizeof t);
t[0]=2;
int lt=1;
//初始化s数组
memset(s,0,sizeof s);
if(a[1]==0) s[0]=1;
else s[0]=2;
int ls=1;

//循环倍增
for(int i=2;i<=l;++i){
//将t(数组)翻倍
mult(t,lt,t,lt,t,lt);
if(a[i]==1) mult(s,ls,t,lt,s,ls);
}
//输出s
s[0]-=2;
for(int i=ls-1;i>=0;--i) printf("%d",s[i]); 
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值