水,关于O(1) 的快速幂
  • 板块灌水区
  • 楼主TLE_
  • 当前回复16
  • 已保存回复16
  • 发布时间2022/8/12 11:34
  • 上次更新2023/10/27 15:48:52
查看原帖
水,关于O(1) 的快速幂
393076
TLE_楼主2022/8/12 11:34

我曾经的一个同学曾今写的一个奇奇怪怪的算法,O(1)q求X的n次方,大致思路就是先求出a = (log2X) * y,然后将a拆为整数部分ia和小数部分fa,然后ans = (1 << ia) * pow(2,fa)

理论上来说复杂度是O(1)的,但是总感觉有什么不对,就是如果不考虑精度的话这个算法有问题嘛?

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    freopen("tst.in","r",stdin);
    freopen("tst.out","w",stdout);
	int x,y;
    cin >> x >> y;
    double logii = log(x) / log(2);
    // cout << logii << endl;
    // cout << (pow(2,logii)) << endl;
    logii *= y;
    // cout << (pow(2,logii)) << endl;
    int inlogii = (int)logii;
    logii -= inlogii;
    // cout << (pow(2,logii)) << endl;
    // cout << (pow(2,inlogii)) << endl;
    // cout << (pow(2,logii)) * (pow(2,inlogii)) << endl;
    int ans = 1;
    double anss = pow(2,logii);
    ans  = ans << inlogii;
    // cout << ans << endl;
    // cout << ans * anss << endl;
    if(logii > 0)
        ans = ans * anss;
    cout << ans;
	return 0;
}
2022/8/12 11:34
加载中...