1. 程式人生 > >周賽快速冪E - Raising Modulo Numbers

周賽快速冪E - Raising Modulo Numbers

第一次接觸快速冪 看了網上很多人的部落格
總算弄清楚原理 寫出了一個模板題
快速冪的原理
通用模板有兩種 一種(mod 2)一種(&)
這題用的第一種 一開始最糾結的地方就是最後一個ans總總會乘出來
第一種模板如下
int fun(long long a,long long n,long long c)
{
long long sum=1;
while(n!=0)
{
if(n%21)
{
sum=(suma)%c;
}
a=(a
a)%c;
n=n/2;
}
return sum;
}
第二種模板
while(n!=0)
{
sum=1;
if(n%1
1)
{
sum=(suma)%c;
}
a=(a

a)%c;
n>>=1;
}
做這題時在取餘時出現了一點小問題 因為數過大的原因所以必須在結構體中進行取餘 導致答案出現問題 最後發現(a%b+c%b)%b=(a+b)%b
每次都需要進行取餘 保證不超過這個取餘數
程式碼如下
#include<stdio.h>
int fun(long long a,long long n,long long c)
{
long long sum=1;
while(n!=0)
{
if(n%2==1)
{
sum=(suma)%c;
}
a=(a
a)%c;
n=n/2;
}
return sum;
}
int main()
{
long long a,n,b,i,c,m,t;
scanf("%lld",&t);
while(t–)
{
scanf("%lld",&c);
scanf("%lld",&m);
long long ans=0;
while(m–)
{
scanf("%lld%lld",&a,&n);
ans+=fun(a,n,c);
ans%=c;
}
ans=ans%c;
printf("%lld\n",ans);
}
return 0;
}