• 十进制快速幂


    Problem . 2

    Input file: power.in

    Output file: power.out

    Time limit: 1 second

    Memory limit: 256 MB

    Mr. Ding 打算考一道比较显然的题目,低头一想,就有了这道题。
    Mr. Ding 需要你计算:
    3^n mod 10^9 + 8
    是不是很简单啊。^_^
    Input
    只有一行,一个数n。
    Output
    输出结果。
    Sample

    input

    3

    output

    27
    Note
    • 对于10% 的数据,1 <= n <= 10^6
    • 对于30% 的数据,1 <= n  <=10^18
    • 对于70% 的数据,1 <= n <= 10^1000
    • 对于100% 的数据,1 <= n <= 10^100000

    题解 :

    我们看到这道题的数据,非常大,所以单纯的乘或者二进制快速幂是不可能过的,所以我们需要使用十进制快速幂,类比二进制快速幂来学习 

    代码 : 

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    const long long M=1e9+8;
    
    long long mpow(long long a,int p){//快速幂,类比二进制快速幂 
      long long rt=1;
      for (;p;p>>=1,a=a*a%M)
        if (p&1) rt=rt*a%M;
      return (rt%M+M)%M;
    }
    
    int main(){
      freopen("power.in","r",stdin);
      freopen("power.out","w",stdout);
      string s1,s;
      cin>>s1;
      s.resize(s1.size());//教训:string类型一开始没有空间,要去访问其空间要先创设出来 ,否则程序会崩溃 
      int n=s1.size();
      for (int i=n-1;i>=0;i--)
        s[n-1-i]=s1[i];
      long long cur=1;
      long long base=3;//base存的是3^(10^i)
      for (int i=0;i<n;i++){
          cur=cur*mpow(base,s[i]-'0')%M;
          base=mpow(base,10);
      }
      printf("%I64d",cur);
      return 0;
    }
  • 相关阅读:
    jQuery插件编写步骤详解
    原生JavaScript实现JSON合并(递归深度合并)
    js原型链继承及调用父类方法
    codefind.pl
    如何为属性是disabled的表单绑定js事件
    平假名、片假名转换
    #和##在宏替换中的作用
    Perl实用中文处理步骤(修改版)
    Perl Unicode全攻略
    nio DirectByteBuffer如何回收堆外内存
  • 原文地址:https://www.cnblogs.com/ganster/p/8447031.html
Copyright © 2020-2023  润新知