2010年清华大学计算机研究生机试真题

http://ac.jobdu.com/problem.php?pid=1085  求root(N, k)

/*
N =a0+a1*k+a2*k^2+......ar*k^r;
N'=a0+a1  +a2    +......ar;
N-N' = a1(k-1)+a2(k^-1)+......+ar(k^r-1)

右边提取k-1,可以得出结论:

(N-N')%(k-1)=0

这样递推下去,

(N-N')%(k-1)=0
(N'-N'')%(k-1)=0
....
(N(r-1)-N(r))%(k-1)=0
直到N(r) < k

所有式子相加(N - N(r))%(k-1)=0,N(r)是我们要求的结果...

注意是求x^y%(k-1),如果x^y%(k-1)==0,则输出k-1,否则输出x^y%(k-1)
*/
#include<iostream>
#include<cstdio>
using namespace std;

inline long long mod_exp(long long x,long long y,int mod)    //快速二分求幂(x^y)%mod  
{  
    long long ans=1;  
    while(y)  
    {  
        if(y&1)  
        {  
            ans*=x;  
            if(ans>=mod)  
                ans%=mod;  
        }  
        x*=x;  
        if(x>=mod)  
            x%=mod;  
        y>>=1;  
    }  
    return ans;  
}

int main(void)
{
	int k;
	long long x,y,temp;
	while(scanf("%lld %lld %d",&x,&y,&k)!=EOF)
	{
		temp = mod_exp(x,y,k-1);
		if(temp == 0)
			printf("%lld\n",k-1);
		else
			printf("%lld\n",temp);
	}
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值