快速幂就是快速求一个数的幂
两个整数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。
乘法分配律
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;
.......