leetcode 372. 超级次方 欧拉降幂

直接快速幂超时 因为要转二进制

typedef long long LL;

class Solution {
public:
    vector<int> chu2(vector<int>& b){

        int jie = 0;
        for(int i=0;i<b.size();i++){
            int curr = jie*10 + b[i];
            jie = curr % 2;
            b[i] = curr/2;
        }
        return b;
    }
    bool iszero(vector<int>& b){
        for(auto i:b){
            if(i!=0){
                return false;
            }
        }
        return true;
    }
    string to_bin(vector<int> b){
        string bin = "";
        while(!iszero(b)){
            bin += b[b.size()-1]%2+'0';
            b = chu2(b);

        }
        for(int i=0;i < bin.size()/2;i++){
            swap(bin[i],bin[bin.size()-1-i]);
        }
        //cout<<"bin "<<bin<<endl;
        return bin;
    }
    int superPow(int a, vector<int>& b) {
        LL x = a;
        //x %= 1337;
        LL ans = 1;
        string bin = to_bin(b);
        int index = bin.size()-1;
        while(index>=0){
            if(bin[index]=='1'){
                ans = ans*x %1337;
            }
            x = (x*x)%1337;
            index--;
        }
        return ans;
    }
};

在这里插入图片描述

递归:
a x y z = ( a x y ) 10 ∗ a z a^{xyz} = (a^{xy})^{10}*a^{z} axyz=(axy)10az
计算一位的时候用快速幂 因为过程中要取模 否则超范围。

class Solution {
public:
    int myPow(int a,int n){
        int ans = 1;
        a%=1337;
        while(n){
            if(n&1){
                ans*=a;
                ans%=1337;
            }
            a*=a;
            a%=1337;
            n>>=1;
        }
        return ans;
    }
    int superPow(int a, vector<int>& b) {
        if(a==0 || a==1){
            return a;
        }else if(b.size() == 1 ){
            return int ( myPow(a,b[0]) )%1337 ;
        }
        else{
            int ba = b.back();
            b.pop_back();
            return  ( int(myPow( superPow(a,b),10)) %1337 * int(myPow(a,ba))%1337 )%1337;
        }
    }
};

在这里插入图片描述
欧拉降幂
a b ≡ { a b % ϕ ( p ) g c d ( a , p ) = 1 a b a 、 p 不 互 素 、 b &lt; ϕ ( p ) m o d p a b % ϕ ( p ) + ϕ ( p ) a 、 p 不 互 素 、 b &gt; = ϕ ( p ) a^b\equiv \left\{\begin{matrix} a^{b\%\phi (p)} &amp; gcd(a,p) = 1 &amp;\\ a^b&amp; a 、p不互素 、b&lt;\phi (p)&amp; mod p\\ a^{b\%\phi (p)+\phi (p)} &amp; a 、p不互素 、b&gt;=\phi (p)&amp; \end{matrix}\right. abab%ϕ(p)abab%ϕ(p)+ϕ(p)gcd(a,p)=1apb<ϕ(p)apb>=ϕ(p)modp
这里用第一行就可以
模运算可以分配

class Solution {
public:
    int myPow(int a,int n){
        int ans = 1;
        a%=1337;
        while(n){
            if(n&1){
                ans*=a;
                ans%=1337;
            }
            a*=a;
            a%=1337;
            n>>=1;
        }
        return ans;
    }

    int superPow(int a, vector<int>& b) {
        int n = 0;
        if(b.size()==0){
            return 0;
        }
        for(int i=0;i<b.size();i++){
            n*=10;
            n+=b[i];
            n%=1140;
        }
        return myPow(a,n);
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值