快速幂的思想

预备知识:
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;

.......

无愧于心,不困于情。
原文地址:https://www.cnblogs.com/SUMMER20020929/p/9751109.html