zoukankan      html  css  js  c++  java
  • 快速幂的思想

    预备知识:
    a*b%p=((a%p)*b)%p
    (a+b)%p=(a%p+b)%p
             

    快速幂就是快速求一个数的幂

    两个整数a,b,求a^b

    把b分解成几个2的次方的和,然后就相当于做一个指数乘法

    比如说2^11

    11=2^3+2^1+2^0

    ans=2^(2^3+2^1+2^0)=2^(2^3)*2^(*2^1)+2^(2^0)

    代码:

    1 long long ksm(long  long a,long long  b){
    2 long long ans=1;
    3 while(b){
    4 if(b&1==1)     ans*=a; //是因为3/2=1,有一个a^1要处理
    5 a*=a;
    6 b/=2;
    7 }
    8 return ans;
    9 }

     

             

    有一道思想一致的题:求a*b%p的结果,1<=a,b。p<=10^18。

    乘法分配律

    比如11*16
    16=2^4;
    ans=11*2^4
     
    代码如下:
    1 long long zc(long long a,long long b,long long c){
    2 long long ans=0;
    3 while(b){
    4 if(b&1==1)ans=(ans+a)%c;
    5 a=(a+a)%c;
    6 b/=2;
    7 }
    8 return ans;
    9 }

    几个注意事项

    1.要用longlong

    2.ans初始化

       加时为0,乘时为1

    几个例题:

    越狱和天平

    天平:

    ~

    一个天平,有N个重量未知的砝码,砝码重量可由你自由确定。砝码可任意放在天平的左右两边,但要求称出从1到M之间所有的重量,现给出N的值,请问M最大值为多少。

    3^0+3^1+3^2+……+3^(n-1)=3^n-1

    ~

    一个天平,砝码分别为1g、3g、9g、27g、…、6561g…,每个砝码只有一个,要称重的物品放在天平的左侧,而砝码允许放在天平的左右两侧。已知一个物品的质量N (N≤108 ),问如何称重?

    分析:就是将N转换成三进制后,将三进制中的0、1、2三个状态转换成 0、1 、-1 ,具体的说,就是0和1不变,2变成-1后,其高一位加1。

    短除法 若余数为2,则现在的那个结果加一,使余数变成-1

    ~

    一个天平,砝码分别为1g、3g、9g、27g、… 、6561g…,每个砝码只有一个,要称重的物品放在天平的左侧,而砝码只允许放在天平的右侧。将由这个系统可以称出来的重量按从小到大的顺序进行排列,得到下列序列:1,3,4,9,10,...。问其中的第K个重量是多少?

    数据规模:K≤105

    //0 1 2 3 4……的序列

    1=3^0; 

    3=3^1;

    4=3^0+3^1;

    9=3^2;

    10=3^0+3^2;

    12=3^1+3^2;

    13=3^0+3^1+3^2;

    .......

    无愧于心,不困于情。
  • 相关阅读:
    字节对齐的问题
    Combination Sum 和Combination Sum II
    Combinations
    算法导论 第六章 思考题6-3 Young氏矩阵
    算法导论 第六章 思考题 6-3 d叉堆
    算法导论 第六章 思考题 6-1 用插入的方法建堆
    Binary Tree Maximum Path Sum
    leetcode candy
    《程序设计与算法(二)算法基础》《第五周 分治》快速排序
    【Tesla】特斯拉Autopilot核心传感器解读之毫米波雷达篇
  • 原文地址:https://www.cnblogs.com/SUMMER20020929/p/9751109.html
Copyright © 2011-2022 走看看