您的位置:首页 > 其它

快速幂求余

2016-01-12 21:37 267 查看

大致思路

积的取余等于取余的积取余

每一个单独取余之后的积在取余,与积取余所得的余数不变。

即(3*3) mod 5 =[(3 mod 5) * (3 mod 5)] mod 5

栗子:

a:底数,b:幂次,c:求余的数

a^b mod c

3^3 mod 5

代码:

#include<bits/stdc++.h>
using namespace std;
int mod(long long a,long long b,int c){
int ans=1;
int k=a%c;
while(b>0)
{
if (b%2==1)
{
ans=(k*ans)%c;
}
b=b/2;
k=(k*k)%c;
}
return ans;
}
int main(int argc, char const *argv[])
{
int t;
cin>>t;
for (int i = 0; i < t; ++i)
{
long long n;
cin>>n;
int q;
q=mod(n,n,10);
printf("%d\n",q);
}
return 0;
}


1.mod函数中,不管奇数偶数都会经过k=k/2。

2.k=(k*k)%c,即同时处理两个数,假如k是奇数在if判断里面单独处理一次,然后在当作偶数进行幂次处理。此时k=(k*k)%c,相当于与暂时把ans需要的值寄存在k上,k是处理数据的中间值,最后都要汇总到ans上,因为最终1肯定是奇数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: