洛谷 P1045 【麦森数】快速幂
不用快速幂,压位出奇迹!
本人是个蒟蒻,不太熟悉快速幂,这里给大家介绍一种压位大法。
让我们来分析一下题目,第一位是送分的,有一个专门求位数的函数: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 【麦森数】快速幂的更多相关文章
- 洛谷 P1045 麦森数
题目描述 形如2^{P}-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^{P}-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...
- 洛谷P1045 麦森数
题目描述 形如2^{P}-12 P −1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12 P −1不一定也是素数.到1998年底,人们已找 ...
- NOIP2003 普及组 洛谷P1045 麦森数 (快速幂+高精度)
有两个问题:求位数和求后500位的数. 求位数:最后减去1对答案的位数是不影响的,就是求2p的位数,直接有公式log10(2)*p+1; 求后500位的数:容易想到快速幂和高精度: 1 #includ ...
- 洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)
这道题太精彩了! 我一开始想直接一波暴力算,然后叫上去只有50分,50分超时 然后我改成万位制提高运算效率,还是只有50分 然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进 ...
- P1045麦森数
P1045麦森数 #include<iostream> #include <cmath> #include <cstring> const int maxn = 1 ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- 【题解】[P1045] 麦森数
题目 题目描述 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1 不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...
- 洛谷P1226 【模板】快速幂||取余运算
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...
- 洛谷P1313 计算系数【快速幂+dp】
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...
随机推荐
- JAVA每日一旅2
1.关于类型转换 两个数值进行二元操作时,会有如下的转换操作: 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型. 否则,如果其中一个操作数是float类型,另一个将会 ...
- Alpha版使用说明
1引言 1 .1编写目的 针对我们发布的alpha版本做出安装和使用说明,使参与内测的人员及用户了解软件的使用方法和相关内容. 1 .2参考资料 <javaWeb程序设计基础><di ...
- classpath与clsspath*
classpath是指 WEB-INF文件夹下的classes目录 classes含义: 1.存放各种资源配置文件 eg.init.properties log4j.properties struts ...
- CodeM Qualifying Match Q2
问题描述: 组委会正在为美团点评CodeM大赛的决赛设计新赛制. 比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分. 比赛采取锦标赛赛制,分轮次进行, ...
- 课堂Beta发布
项目组名:奋斗吧兄弟 小组成员:黄兴,李俞寰,栾骄阳,王东涵,杜桥 今天6个小组在课上进行了Bate发布,以下是我的一些看法: 飞天小女警的礼物挑选系统: 由于是第一个Bate发布的项目,所以我印象较 ...
- js css样式操作代码(批量操作)
js css样式操作代码(批量操作) 作者: 字体:[增加 减小] 类型:转载 时间:2009-10-09 用js控制css样式,能让网页达到良好的的用户体验甚至是动画的效果.并且考虑到效率. ...
- [51CTO]区块链在美国:10个案例、10个问题和5个解决方案
区块链在美国:10个案例.10个问题和5个解决方案 近日,美国国际战略研究中心(CSIS, Center for Strategic and International Studies)发布报告< ...
- 【版本管理】自定义git
Git除了可配置user.name和user.email外,实际上,Git还有很多可配置项. 如 $ git config --global color.ui true,让Git显⽰示颜⾊色,会让命令 ...
- asp.net使用动态模版导出word
具体思路: 1.先制作Word模版,使用文本框+书签的方式来设计模版: 2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件: 3.后台取得数据,参照网页渲染的方 ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...