不用快速幂,压位出奇迹!

本人是个蒟蒻,不太熟悉快速幂,这里给大家介绍一种压位大法。

让我们来分析一下题目,第一位是送分的,有一个专门求位数的函数:n*log10(2)+1。 然后题目中p<=3100000,又要求后500位,普通算法肯定超时,但如果我们多压几位甚至时间都比普通快速幂少。而且我们用 long long 的话可以一次就乘上2的20次方又能节省时间;

第一问:

s=n*log10(2)+1;用函数算位数
cout<<s<<endl;

第二问:算后500位:

while(n>=20){
k=0;
for(i=1;i<=50||i<=top;i++){//数组的每一个元素里放十位数
a[i]=a[i]*1048576+k;//每次乘上2的20次方:“1048576”把longlong剩余9位用到位
k=a[i]/ya;a[i]%=ya;//进位
if(top<50&&k&&i==top)top++;//加位数
}
n-=20;//一次算20个
}

注意:n<20时还需要还需要用一次乘2的循环!

小于500位要加前导零:

while(i<=50){//小于500位,要加前导零
for(j=1;j<=5&&i<=50;i++,j++)cout<<"0000000000";//补10个0
if(j==6)cout<<endl;
}

大于500位的情况:

while(i>=1){//注意:大于五百位也有可能有前导零
for(j=1;j<=5&&i>=1;i--,j++){//是每一个元素(10位)中的的前导零
if(a[i]>1000000000)cout<<a[i];//判断是否有前导零
else{
s=a[i];
while(s>0){s/=10;o++;}//记录前导零个数
o=10-o;
while(o>0){o--;cout<<"0";}//输出
cout<<a[i];
}
}
cout<<endl;
}

完整代码:(因为有些情况会重复,代码会有点长)

#include<iostream>
#include<cmath>
using namespace std;
long long a[51]={0,1},n,i,j,o,s,k,top=1;
int main(){
cin>>n;
s=n*log10(2)+1;//用函数算位数
cout<<s<<endl;
while(n>=20){
k=0;
for(i=1;i<=50&&i<=top;i++){//数组的每一个元素里放十位数
a[i]=(a[i])<<20+k;//每次乘上2的20次方:1048576 把longlong剩余9位用到位
k=a[i]/10000000000;a[i]%=10000000000;//进位
if(top<50&&k&&i==top)top++;//加位数 ,前面s算过了 可以省
}
n-=20;//一次算20个
}
while(n){//把20个以下的依次算完
k=0;
for(i=1;i<=50&&i<=top;i++){
a[i]=a[i]<<1+k;
k=a[i]/10000000000;a[i]%=10000000000;//用法同上
if(top<50&&k&&i==top)top++;
}
n--;
}
a[1]--;
if(top<50){
i=top+1;//可以用s
while(i<=50){//小于500位,要加前导零
for(j=1;j<=5&&i<=50;i++,j++)cout<<"0000000000";
if(j==6)cout<<endl;
}
i=top;
for(;j<=5&&i>=1;i--,j++){//注意:50位一行!!!j<=5!!!
if(a[i]>=1000000000)cout<<a[i];
else{
s=a[i];
while(s>0){s/=10;o++;}
o=10-o;
while(o>0){o--;cout<<"0";}
cout<<a[i];
}
}
cout<<endl;
while(i>=1){//注意:大于五百位也有可能有前导零
for(j=1;j<=5&&i>=1;i--,j++){//是每一个元素(10位)中的的前导零
if(a[i]>1000000000)cout<<a[i];//判断是否有前导零
else{
s=a[i];
while(s>0){s/=10;o++;}//记录前导零个数
o=10-o;
while(o>0){o--;cout<<"0";}//输出
cout<<a[i];
}
}
cout<<endl;
}
}
else{
s=a[50];
i=50;
while(i>=1){
for(j=1;j<=5&&i>=1;i--,j++){
if(a[i]>1000000000)cout<<a[i];
else{
s=a[i];
while(s>0){s/=10;o++;}// 这一段用法同上
o=10-o;
while(o>0){o--;cout<<"0";}
cout<<a[i];
}
}
cout<<endl;
}
}
return 0;
}

啊,好长啊,压位果然有副作用。

这是我的博客,发的题解和一些洛谷技巧都在里面。

另外,本人真的只是一个弱弱的萌新,7月份才入信息组,发的题解讨论等级不高,新人可看。

洛谷 P1045 【麦森数】快速幂的更多相关文章

  1. 洛谷 P1045 麦森数

    题目描述 形如2^{P}-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^{P}-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...

  2. 洛谷P1045 麦森数

    题目描述 形如2^{P}-12 ​P ​​ −1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12 ​P ​​ −1不一定也是素数.到1998年底,人们已找 ...

  3. NOIP2003 普及组 洛谷P1045 麦森数 (快速幂+高精度)

    有两个问题:求位数和求后500位的数. 求位数:最后减去1对答案的位数是不影响的,就是求2p的位数,直接有公式log10(2)*p+1; 求后500位的数:容易想到快速幂和高精度: 1 #includ ...

  4. 洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)

    这道题太精彩了! 我一开始想直接一波暴力算,然后叫上去只有50分,50分超时 然后我改成万位制提高运算效率,还是只有50分 然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进 ...

  5. P1045麦森数

    P1045麦森数 #include<iostream> #include <cmath> #include <cstring> const int maxn = 1 ...

  6. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  7. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  8. 【题解】[P1045] 麦森数

    题目 题目描述 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1 不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...

  9. 洛谷P1226 【模板】快速幂||取余运算

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...

  10. 洛谷P1313 计算系数【快速幂+dp】

    P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...

随机推荐

  1. VMware10 安装centos6.7 设置NAT模式固定ip

    https://www.cnblogs.com/yychnbt/p/5173761.html

  2. Linux内核分析——构造一个简单的Linux系统MenuOS

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...

  3. java向上转型和向下转型

    转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...

  4. Beta 讨论分析——持续更新ing

    wonderland Beta 讨论分析 标签(空格分隔): 软工实践 wonderland 主要工作: info信息: 1.关联账号界面:hbb 2.标签检索界面:hbb 3.近期活跃度(cf.hd ...

  5. ctr中的GBDT+LR的优点

    1 为什么gbdt+lr优于gbdt? 其实gbdt+lr类似于做了一个stacking.gbdt+lr模型中,把gbdt的叶子节点作为lr的输入,而gbdt的叶子节点相当于它的输出y',用这个y'作 ...

  6. CMS垃圾回收过程

    1.总体介绍: CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器.对于要求服务器响应速度的应用上,这种垃圾回收器非常适合.在启动JVM参数加上 ...

  7. Caffe使用: Ubuntu 14.04(x64) 从cuda 7.0 升级到 cuda8.0

    由于之前已经在Ubuntu 14.04 x64上面安装cuda7.0+caffe, 并且已经配置好,caffe也已经跑通. 但是最近需要使用Torch,而Torch对cuda的要求是8.0,因此决定对 ...

  8. 【IneliJ 】使用IneliJ IDEA 2016将Java Web项目导出为War包

    本文记录使用IDEA导出war包的过程以及碰到问题的解决办法 虽说现在改用IDEA进行开发了,但还是用eclipse打war包 ….囧 这样下去不是办法... 于是今天就试着使用IDEA进行打包. 项 ...

  9. 【bzoj1088】扫雷

    见过水的,没见过这么水的 Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则 ...

  10. 【bzoj1069】最大土地面积

    Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第1行一个正整数N,接下来N行,每行2个数x,y ...