fzu 1752

Description

Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63).

Input

There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.

Output

For each testcase, output an integer, denotes the result of A^B mod C.

Sample Input

3 2 4 2 10 1000

Sample Output

1 24
这个题特别卡数据和时间,输入输出的时候不要用cin,cout,并且尽量用位运算。
还有就是两个大数相乘,为了防止数据溢出,需要把其中一个数用二进制表示,这样两个数的积就变成了多项式求和。
代码:
#include <iostream>
typedef unsigned __int64 mm;
using namespace std;
#include <stdio.h>
mm hehe(mm a,mm b,mm m)
{
    mm sum=0,tmp=a%m;//防止数据溢出
    while(b)
    {
        if(b&1)
        {
         if((sum+=tmp)>=m)
               sum-=m;
        }
        if((tmp<<=1)>=m)
            tmp-=m;
        b>>=1;
    }
    return sum%m;
}
mm qm(mm m,mm n,mm p)
{
  mm b=1;
  while(n>1)
  {
   if(n%2==0)
   {
    m=hehe(m,m,p);
    n=n/2;
   }
   else
   {
    b=hehe(b,m,p);
    n--;
   }
  }
  return hehe(m,b,p);
}

int main()
{
    mm m,n,p;
    while(~scanf("%I64u%I64u%I64u",&m,&n,&p))
    {
      printf("%I64u\n",qm(m,n,p));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值