P1045 [NOIP2003 普及组] 麦森数

本文介绍了一种优化的高精度模拟方法来解决NOIP2003普及组的麦森数问题。通过一次乘以2的20次方避免超时,并提出在第一位达到10位数时才进行进位的策略,减少了时间开销。此外,注意到当长度超过500位时,只需计算前500位,进一步提高效率。最后,用两次高精度运算完成十进制的进位操作。
摘要由CSDN通过智能技术生成

P1045 [NOIP2003 普及组] 麦森数

直接纯模拟,然后想办法优化

  • 如果直接模拟计算那么位数太大会超时数学方法
  • 一次乘2^20次方
  • 做题的时候想到的 (貌似叫做压位)

一般来说高精度原理,是把让数组的每一位表示数的位数,所以只要第一位大于10,就直接进位

如果每一次都这样进位的话,那么时间的开销会很大

那么就可以考虑当第一个数为10位数时再进位;这样会大大减少时间

注意细节

  • 没有满500位需要输出前导零
  • 其实如果长度大于500,就不需要再多计算,只需要计算500以内的数(也是种减少时间的方法
  • 高精(压位)完之后 再高精一次,这时的高精需要按照十进制再进位(这里也就最大O(500))
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int p;
long long s[520];
int main(){
   
    bool book=0;
    scanf("%d",&p);
    memset(s,0,sizeof(s));
    s[1]=1;
    int len=1;
    int lim=p/20;
    for(register int i=1;i<=lim;++i){
   //一次2^20次方
        for(register int j=1;j<=len
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值