快速幂

证明(m * n) % c = (m % c * n % c) % c

设m = ic + p

设n  = jc + q

左式等于((ic + p) * (jc + q)) % c

化简得(ijc^2 + iqc + jpc + pq)% c = pq % c

右式等于((ic + p) % c * (jc + q) % c) %c 

化简得(p * q) % c 

故左式等于右式

证毕!

一.普通快速幂:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a,b;
 5     int result=1;
 6     scanf("%d%d",&a,&b);
 7     while(b>0)
 8     {
 9         if(b%2==1)
10             result=((result%1000)*(a%1000))%1000;
11         a=((a%1000)*(a%1000))%1000;
12         b=b/2;
13     }
14     printf("%d",result);
15     return 0;
16 }

二.优化后的快速幂:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a,b;
 5     int result=1;
 6     scanf("%d%d",&a,&b);
 7     while(b>0)
 8     {
 9         if(b&1)//利用位运算判断是否为奇数
10             result=((result%1000)*(a%1000))%1000;
11         a=((a%1000)*(a%1000))%1000;
12         b=b>>1;
13     }
14     printf("%d",result);
15     return 0;
16 }

 

posted @ 2022-01-12 16:52  scannerkk  阅读(51)  评论(0)    收藏  举报