1600: Big Mod

 1600: Big Mod


StatusIn/OutTIME LimitMEMORY LimitSubmit TimesSolved UsersJUDGE TYPE
stdin/stdout3s8192K1480269Standard

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;
}
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值