P1045 开了O2优化反而全TLE了

P1045 [NOIP2003 普及组] 麦森数

kaedeakari @ 2024-07-18 09:43:18

  试着自己写了一个500位的高精度结构体进行计算,学了快速幂的算法,没有压位。结果一跑直接全部TLE了。在阅读了几篇题解,确信自己代码应该没问题之后,突然看到说建议把O2优化关掉,试了试,全AC了。

  理论上O2优化应该是加速代码运行速度的,但为什么反而会超时呢?求大佬解惑。

  附上代码(仅供调试):

#include <iostream>
#include <cmath>
using namespace std;

struct HQNumber{
    int digits[500]={0};  

    HQNumber operator*(HQNumber &B){
        HQNumber ans;
        int dP = 0;
        for(int i=0;i<500;i++){
            ans.digits[i] += dP;
            for(int j=0;j<=i;j++){
                ans.digits[i] += digits[j]*B.digits[i-j];
            }
            dP = ans.digits[i]/10;
            ans.digits[i] %= 10;
        }
        return ans;
    }
};

ostream & operator<<(ostream &out, HQNumber &B){
    for(int i=0;i<10;i++){
        for(int j=0;j<50;j++){
            cout << B.digits[499-i*50-j];
        }
        cout << endl;
    }
}

int main(){
    int P;
    cin >> P;
    cout << ceil(P*log10(2)) << endl;
    HQNumber base, ans;
    base.digits[0] = 2;
    ans.digits[0] = 1;
    for(int b=P;b;b/=2){
        if(b%2==1){
            ans = ans * base;
        }
        base = base * base;
    }
    ans.digits[0] --;
    cout << ans;
    return 0;
}

by jmy2012 @ 2024-07-18 09:47:52

本题的氧气有毒


|