嘿嘿今天学了快速幂也~~
Problem Description:
求x的y次方的最后三位数 。
Input:
一个两位数x和一个两位数y。
Output:
输出x的y次方的后三位数。
Sample Input:
13 13
Sample Output:
253思路:快速幂求a^b,然后mod c。因为是随便输入的a,b,所以范围很大,而题目只需求最后三位,所以百位以上的计算不用理了,直接%1000。
1 #include <stdio.h> 2 int main() 3 { 4 unsigned long long a,b; 5 while(scanf("%llu%llu",&a,&b)!=EOF) 6 { 7 unsigned long long c=1,d=a; 8 while(b!=0) 9 { 10 if(b&1!=0)//如果是0则无需计算,因为n*1=n 11 c*=d%1000; 12 d*=d%1000; 13 b>>=1; 14 } 15 if(c%1000>99) 16 printf("%llu\n",c%1000); 17 else if(c%1000>9) 18 printf("0%llu\n",c%1000); 19 else 20 printf("00%llu\n",c%1000); 21 } 22 return 0; 23 }
Tip:以上mod c是因为怕数字过大爆了,一是因为a的b次mod c,二是因为早晚要mod c,所以早mod 无所谓。
小知识:
快速幂原理:a^b,将b拆成二进制数相加的形式,从而使运算次数减少
Example:a^11=a^(2^0+2^1+2^3),时间复杂度为O(log11)。
1 scanf("%d%d",&a,&b) 2 int c=1,d=a; 3 while(b!=0) 4 { 5 if(b&1!=0)//取b的二进制数的最后一位(相当于b%2!=0) 6 c*=d; 7 d*=d; //每往右推一位,d倍增,2^0 2^1 2^2…… 8 b>>=1;//将b的二进制数往右推一位(相当于b/=2) 9 } 10 printf("%d\n",c);//c=a^b
时间: 2024-10-22 00:44:17