1600: Big Mod

 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;
}
*/

你可能感兴趣的:(1600: Big Mod)