先看代码:
inline unsigned long long power(unsigned long long a,unsigned long long b)
{
unsigned long long sum = 1,base = a;
while(b)
{
if(b&1==1)
{
(sum *= base) %= p;
}
base = base*base % p;
b = b>>1;
}
return sum;
}
这就是快速幂。 它的原理很简单,就是求出指数的二进制的最后一位,来判断是不是偶数,然后右移一位把二进制位的最后一位抛掉。这样就能找到指数的二进制的每一位,最后进行运算即可。。。
P3197 [HNOI2008]越狱 这一题就是用的快速幂来运算的,但这题
m
n
m^{n}
mn 求出来要减去不能越狱的情况,即
m
×
m
−
1
n
−
1
m×m-1^{n-1}
m×m−1n−1,最后输出即可。。。(好像漏了什么)
Code:
#include<bits/stdc++.h>
using namespace std;
const unsigned long long p=100003;
inline unsigned long long power(unsigned long long a,unsigned long long b);
signed main(signed argc,char *argv[])
{
unsigned long long m,n;
cin >> m >> n;
cout << (power(m,n) % p - (m * power(m-1,n-1)) % p + p )% p << endl;
return 0;
}
inline unsigned long long power(unsigned long long a,unsigned long long b)
{
unsigned long long sum = 1,base = a;
while(b)
{
if(b&1==1)
{
(sum *= base) %= p;
}
base = base*base % p;
b = b>>1;
}
return sum;
}