开始用了pow函数,6789^10000算出来时负的,应该是超了,但是网上搜了一下说c++的pow()是支持longlong的提供重载函数的https://blog.csdn.net/major_zhang/article/details/51456681,难道是结果超了???
后来又发现循环内部变量用的int……
再后来……循环*A;还是wa……
重点在这:一直乘下去,结果会超,有一个数学规律:结果每次对1000取余,后三位不变,不懂个话,补一下数论知识(同余运算及其基本性质)
http://www.matrix67.com/blog/archives/236
代码:
#include<iostream> #include<stdio.h> using namespace std; int main() { long long int n,m; while(cin>>n>>m) { if(n==0&&m==0) break; long long int t=1; for(long long int i =1;i<=m;i++) { t*=n; if(t>=1000) t = t%1000; } cout<<t<<endl; } return 0; }
快速幂:
快速幂可以高效的计算幂运算。如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,使用快速幂的话就只用 O(log n)。
如果我们求解 2^k。可以将其表示为
x^n =( (x²)²....)
只要做k次平方运算就可以了,由此我们可以想到,先将n表示为2的幂方次之和
n = 2^k1 + 2^k2 + 2^k3...
就有
x^n = x^(2^k1) x^(2^k2) x^(2^k3)...
快速幂模板:
typedef long long ll; //注意这里不一定都是long long 有时 int 也行 ll mod_pow(ll x, ll n, ll mod){ ll res = 1; while( n > 0 ){ if( n & 1 ) res = res * x % mod; //n&1其实在这里和 n%2表达的是一个意思 x = x * x % mod; n >>= 1; //n >>= 1这个和 n/=2表达的是一个意思 } return res; }
递归版:
typedef long long ll; ll mod_pow(ll x, ll n, ll mod){ if( n == 0 ) return 1; ll res = mod_pow( x * x % mod, n / 2, mod ); if( n & 1 ) res = res * x % mod; return res; }
快速幂解决这道题:
#include<stdio.h> int mod_pow(int x, int n,int mod){ //快速幂 int res = 1; while( n > 0 ){ if( n & 1 ) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } int main(){ int m,n; while(scanf("%d%d",&m,&n),n||m) printf("%d ",mod_pow(m,n,1000)); return 0; }