NYOJ 102(高次幂取模)

简介: 1.二分递归: 使用a*b(mod   n)=(a(mod   n)*b(mod   n))(mod   n)即可。    #include /* 错误 long long fun(long long a,long long b,long long c) { long long...

1.二分递归:

使用a*b(mod   n)=(a(mod   n)*b(mod   n))(mod   n)即可。 

 

#include<stdio.h>
/*
错误
long long fun(long long a,long long b,long long c)
{
	long long temp;
	if(0==b)
		return 1;
	temp=fun(a,b/2,c);
	if(b&1)
		return temp*a%c;
	return temp;
}
*/
/*
AC
long long fun(long long x,long long y,long long p)

{

	long long t=x;

	long long ans=1;

	while(y)

	{

	if(y&1)

	ans=t*ans%p;

	t=t*t%p;

	y=y>>1;
	}
	return (int)ans;
}
*/
long long fun(long long a,long long b,long long c)
{
	long long temp,ans;
	if(0==b)
		return 1;
	temp=fun(a,b/2,c);
	ans=temp*temp%c;
	if(b&1)
		return ans*a%c;
	return ans;
}
/*
TLE
long long fun(long long a,long long b,long long c)
{
	long long temp,ans;
	int i;
	ans=a%c,temp=1;
	for(i=0;i<b;i++)
		temp=(ans*temp)%c;
	return temp;
}
*/
int main()
{
	int i,T;int num;
	long long a,b,c;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld%lld",&a,&b,&c);
		printf("%lld\n",fun(a,b,c));
	}
	return 0;
}

  

2.s   =   (p   ^   e)   mod   n   =   ((p   mod   n)   ^   e)   mode   n。 

所以,只需要对p除以n的余数进行e次方的运算,而且每运算一步都进行一次取模就可以了。 

做密码的程序需要一点数论基础。

 

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
7月前
|
C++
3 的幂(C++)
3 的幂(C++)
74 0
|
7月前
大整数的因子(利用求余)
大整数的因子(利用求余)
|
7月前
|
C++
2 的幂(C++)
2 的幂(C++)
58 1
|
7月前
|
C++
4的幂(C++)
4的幂(C++)
47 0
|
7月前
[leetcode 数位运算] 2939. 最大异或乘积 M
[leetcode 数位运算] 2939. 最大异或乘积 M
|
存储 C++
求2的N次幂(C++)解决高精度运算
求2的N次幂(C++)解决高精度运算
295 0
|
机器学习/深度学习
1208:2的幂次方表示
1208:2的幂次方表示
156 0
|
Java C++ Python
负数取余,取余和取模
负数取余,取余和取模