ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

快速幂

2021-10-01 20:03:30  阅读:169  来源: 互联网

标签:int memset long ans sizeof 快速 500


1.模板

求n的m次方

#include<iostream>
#define MOD 1000000007
using namespace std;
//递归快速幂 
int quickpow(long long a,long long n){
        if(n==0) return 1;
        else if(n%2==1){
            return quickpow(a,n-1)*a%MOD;
            
        }else{
            int t=quickpow(a,n/2)%MOD;
            return t*t%MOD;
        }
}
int Uquickpow(int a,int n){
    int ans=1;
    while(n){
        if(n&1){   //n最后一位等于1 
            ans=ans*a;
        }
        a=a*a;
        n>>=1;//n右移一位 
        
    }
    return ans; 
} 
int main()
{
    
    cout<<Uquickpow(7,5);
    cout<<quickpow(7,5);


}

2.题目

洛古p1045

#include<bits/stdc++.h>
const long long mod=10000000000;
using namespace std;
const int N=1e5+10;
int l=1,la=1;
int ans[N]= {},a[N]= {},c[N]={};
using namespace std;
void cheng1(){//ans*a
    memset(c,0,sizeof(c));//临时数组c 
    for (int i = 1; i <= l; ++i)   {
        for (int j = 1; j <= la; ++j) {
            c[i+j-1] += ans[i] * a[j];
            c[i+j] += ( c[i+j-1] ) / 10;
            c[i+j-1] %= 10;
        }
    }
    int lc = l + la;
    while( c[lc] == 0 ) -- lc;
    for(int i = 1;i <= lc; ++i){
        ans[i] = c[i];
    }
    //l=lc
    if(lc>500){
        l=500;
    }else{
        l=lc;
    } 
    
    
}
void cheng2(){//a*a
    memset(c,0,sizeof(c));//临时数组c 
    for (int i = 1; i <= la; ++i)   {
        for (int j = 1; j <= la; ++j) {
            c[i+j-1] += a[i] * a[j];
            c[i+j] += ( c[i+j-1] ) / 10;
            c[i+j-1] %= 10;
        }
    }
    int lc = la + la;
    while( c[lc] == 0 ) -- lc;
    for(int i = 1;i <= lc; ++i){
        a[i] = c[i];
    }
   // la=lc;
      if(lc>500){
        la=500;
    }else{
        la=lc;
    } 
    
    
}
void qpow(int P){
    int ans=1;
    while(P){
        if(P&1){
            cheng1();//ans=ans*a
        }
        cheng2();//a=a*a
        P>>=1;
    }
}
int main()
{
    int P;
    cin>>P;
    memset( a, 0, sizeof(a));
    memset( ans, 0, sizeof(ans));
    ans[1]=1;
    a[1]=2;
    qpow(P);
//    cout<<l<<endl;
    cout<<int((P*log10(2.0)+1))<<endl;
    ans[1]--;
    int num=0;
    for(int i=500;i>=1;i--){
        cout<<ans[i];
        num++;
        if(num==50){
            cout<<endl;
            num=0;
        }
    }


}
View Code

 

标签:int,memset,long,ans,sizeof,快速,500
来源: https://www.cnblogs.com/lwx11111/p/15359943.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有