1600: Big Mod
Status | In/Out | TIME Limit | MEMORY Limit | Submit Times | Solved Users | JUDGE TYPE |
---|---|---|---|---|---|---|
stdin/stdout | 3s | 8192K | 1480 | 269 | Standard |
Calculate
for large values of B, P, and M using an efficient algorithm. (That's right, this problem has a time dependency !!!.)
Input
Three integer values (in the order B, P, M) will be read one number per line. B and P are integers in the range 0 to 2147483647 inclusive. M is an integer in the range 1 to 46340 inclusive.
Output
The result of the computation. A single integer.
Sample Input
3 18132 17 17 1765 3 2374859 3029382 36123
Sample Output
13 2 13195
#include<stdio.h>
long mod(int b,int p,int m)
{
if(m==1||b==0) return 0;
if(p==0) return 1;
if(p%2) return (b%m*mod(b,p-1,m))%m;
long long temp=mod(b,p/2,m);
return (temp*temp)%m;
}
int main()
{
long long b,p,m;
while(scanf("%d%d%d",&b,&p,&m)!=-1)
{
printf("%ld/n",mod(b,p,m));
}
return 0;
}
/*
由于数太大 所以要采用分治的方法
同余定理,大家都很熟悉吧
(a+b)%c=(a%c+b%c)%c;
(a*b)%c=(a%c*b%c)%c;
对于大数的求余,联想到进制转换时的方法,得到
举例如下,设大数 m=1234,模n
就等于((((1*10)%n+2%n)%n*10%n+3%n)%n*10%n+4%n)%n
写了一个简单的模板
#include<stdio.h>//大数求余,其中n(除数)不是大数
char a[1000];
int main()
{
int i,j,k,m,n;
while(scanf("%s%d",a,&n)!=EOF)
{
m=0;
for(i=0;a[i]!='/0';i++)
m=((m*10)%n+(a[i]-'0')%n)%n;
printf("%d/n",m);
}
return 0;
}
*/