首先我们设题目要求为a^b mod c
int quickMod(int a, int b, int c)
{
int ans = 1;
while (b)
{
if (b % 2 == 1)
ans = (ans * a) % c;
b /= 2;
a = (a * a) % c;
}
return ans;
}
这个算法的时间复杂度为O(logn)
if(b % 2 == 1) 就相当于if(b & 0x1), b /= 2也就是b>>=1。
while(b>=1)
{
if(b%2!=0) k=a*k%c;
a=a*a%c;如果a*a会超过int的范围,可以改为a=((a%c)*(a%c))%c;
b/=2;
}
return k;
http://poj.org/searchproblem?field=source&key=Waterloo+Local+Contest
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
long long a,p;
int isprime(long long n);
long long modular(long long a,long long r,long long m);
while(cin>>p>>a)
{
if(p==0&&a==0)
break;
long long result;
if(isprime(p))
cout<<"no"<<endl;
else
{
if(a==modular(a,p,p))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
return 0;
}
int isprime(long long n)
{
int i;
if(a == 2)
return 1;
for(i = 2; i*i<=a; i++)
if(a%i == 0)
return 0;
return 1;
}
long long modular(long long a,long long r,long long m)
{
long long d=1,t=a;
while(r>0)
{
if(r%2==1)
d=(d*t)%m;
r/=2;
t=t*t%m;
}
return d;
}
http://poj.org/searchproblem?field=source&key=Waterloo+Local+Contest
(A
1
B1
+A
2
B2
+ … +A
H
BH
)mod M
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(a + b) % p = (a % p + b % p) % p (1)
(a – b) % p = (a % p – b % p) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
(a^b) % p = ((a % p)^b) % p (4)
结合律:
((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)
交换律:
(a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
分配律:
((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9)
重要定理:
若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10)
若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11)
若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a – c) ≡ (b – d) (%p),
(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long modular(long long a,long long b,long long c)
{
int ans=1;
while(b)
{
if(b&1)
ans=ans*a%c;
b>>=1;
a=a*a%c;
}
return ans;
}
int main()
{
int t,h,m;
long long a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&h);
long long ans=0;
while(h--)
{
scanf("%lld%lld",&a,&b);
ans=(ans+modular(a,b,m))%m;
}
printf("%lld\n",ans);
}
return 0;
}