1326:【例7.5】 取余运算(mod)


【题目描述】
输入b,p,k的值,求b^p mod k的值,其中b,p,k*k为长整型数。
【输入】
输入b,p,k的值。
【输出】
求b^p mod k的值。
【输入样例】
2 10 9
【输出样例】
2^10 mod 9=7

题目很简单。

我首先用死做,超时了

我然后用pow的(错误代码)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,k,bao;
int main(){
	cin>>n>>m>>k;
	bao=pow(n,m);
	cout<<n<<"^"<<m<<" mod "<<k<<"="<<bao%k;
}

错了。

想了想,用分治吧!(错误答案)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,z;
int par(int y){
	int c;
	if(y==1) return x;
	if(y%2==1) return par(y/2)*par(y/2)*x;
	else return par(y/2)*par(y/2);
}
main(){
	cin>>x>>y>>z;
	cout<<x<<"^"<<y<<" mod "<<z<<"="<<par(y)%z;
}

错了。

想着时间超限吧,加了ans加快速度。。。(原本只需做两次的只做一次就行了)(错误答案)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,z;
int par(int y){
	int ans;
	if(y==1) return x;
	if(y%2==1){
		ans=par(y/2);return ans*ans*x;
	}
	else{
		ans=par(y/2);return ans*ans;
	}
}
main(){
	cin>>x>>y>>z;
	cout<<x<<"^"<<y<<" mod "<<z<<"="<<par(y)%z;
}

内存超限…………………………………………

最后想到,同余。

a*b*c%k=a%k*b%k*c%k;不会爆。

所以(正确答案)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,z;
int fz(int y){
	int c;
	if(y==1) return x%z;
	if(y%2==1) return c=fz(y/2),c*c%z*x%z;
	else return c=fz(y/2),c*c%z;
}
main(){
	cin>>x>>y>>z;
	cout<<x<<"^"<<y<<" mod "<<z<<"="<<fz(y);
}

我阿米诺斯。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值