模运算性质
(a * b) % p = ((a % p) * (b % p)) % p
long long A(long long a,long long b,long long c)
{
long long ans=1;
a=a%c;
while(b)
{
if(b%2==1)
{
ans=ans*a%c;
}
a=a*a%c;
b=b/2;
}
return ans;
}
运用3^10的例子来理解
快速幂
Problem:751
Time Limit:1000ms
Memory Limit:65536K
Description
计算a的b次方对c取余的结果.
Input
输入数据有多组,每行给定三个数字a,b,c(保证a,b,c均在int型以内并且不等于0)
Output
对于每组测试数据,输出对应的结果
Sample Input
2 2 3
Sample Output
1
Hint
Source
#include <bits/stdc++.h>
using namespace std;
long long A(long long a,long long b,long long c)
{
long long ans=1;
while(b)
{
if(b%2==1)
{
ans=ans*a%c;
}
a=a*a%c;
b=b/2;
}
return ans;
}
int main()
{
long long a,b,c;
while(cin>>a>>b>>c)
printf("%lld\n",A(a,b,c));
return 0;
}
快速幂
Problem:770
Time Limit:1000ms
Memory Limit:65536K
Description
给定3个正整数a,b,m,求a^b % m的值。
Input
输入数据第一行一个T(T<=100),表示测试数据的组数,接下来T行,每行3个数a,b,m,数据范围都在10^9以内。
Output
输出结果。
Sample Input
2
2 3 5
5 6 7
Sample Output
3
1
Hint
Source
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX 100010
ll f(ll a,ll b,ll c)
{
ll m=1;
a=a%c;
while(b)
{
if(b%2==1)
{
m=m*a%c;
b--;
}
b>>=1;
a=a*a%c;
}
return m;
}
int main()
{
ll n;
while(scanf("%lld",&n)!=EOF)
{
long long b[MAX];
long long i,num1,num2,num3;
for(i=0;i<n;i++)
{
scanf("%lld%lld%lld",&num1,&num2,&num3);
b[i]=f(num1,num2,num3);
}
for(i=0;i<n;i++)
printf("%lld\n",b[i]);
}
return 0;
}
快速幂取模
Problem:601
Time Limit:1000ms
Memory Limit:65536K
Description
给定A,B,C,计算AB%C,这里AB代表A的B次方。
Input
输入数据有多组,每组数据一行,有3个正整数分别为A,B和C,1<=A,B,C<=1000000000
Output
输出A^B%C的值
Sample Input
2 3 5
8 2 10
Sample Output
3
4
Hint
Source
#include <bits/stdc++.h>
using namespace std;
long long A(long long a,long long b,long long c)
{
long long ans=1;
while(b)
{
if(b%2==1)
{
ans=ans*a%c;
}
a=a*a%c;
b=b/2;
}
return ans;
}
int main()
{
long long a,b,c;
while(cin>>a>>b>>c)
printf("%lld\n",A(a,b,c));
return 0;
}
都是OJ的模板题