PHP乘法逆元问题怎么解决-创新互联

这篇文章主要讲解了“PHP乘法逆元问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP乘法逆元问题怎么解决”吧!

目前创新互联已为1000+的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器托管、企业网站设计、永靖网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

Recommend lcy

设S(x)表示x的因子和。则题目求为:S(2004^X)mod 29
因子和S是积性函数,即满足性质1。

性质1 :如果 gcd(a,b)=1 则 S(a*b)= S(a)*S(b)
2004^X=4^X * 3^X *167^X
S(2004^X)=S(2^(2X)) * S(3^X) * S(167^X)

性质2 :如果 p 是素数 则 S(p^X)=1+p+p^2+...+p^X = (p^(X+1)-1)/(p-1)
因此:S(2004^X)=(2^(2X+1)-1) * (3^(X+1)-1)/2 * (167^(X+1)-1)/166
167%29 == 22
S(2004^X)=(2^(2X+1)-1) * (3^(X+1)-1)/2 * (22^(X+1)-1)/21

性质3 :(a*b)/c %M= a%M * b%M * inv(c)
其中inv(c)即满足 (c*inv(c))%M=1的最小整数,这里M=29
则inv(1)=1,inv(2)=15,inv(22)=15

有上得:
S(2004^X)=(2^(2X+1)-1) * (3^(X+1)-1)/2 * (22^(X+1)-1)/21
=(2^(2X+1)-1) * (3^(X+1)-1)*15 * (22^(X+1)-1)*18

快速幂取模就是在O(logn)内求出a^n mod b的值。算法的原理是ab mod c=(a mod c)(b mod c)mod c 390MS

#include<iostream>
using namespace std;
const int pow[][3]={{2,5,32},{3,4,81},{22,2,484}};
//2^5>29,3^4>29,22^2>29,用于求(b^i)%29
int PowMod29(int x,int index)   //快速模幂
{
	int ans=1;
	while(index>=pow[x][1]) //当指数大于这个值将会超过29
	{
		ans=(ans*pow[x][2])%29;  //所以要模29.并且要乘上前面的值!
		index-=pow[x][1];
	}
	while(index--) ans=(ans*pow[x][0])%29;//把剩余的不超过29的乘上!再记得模上29(因为有可能超过29)
	return ans;
}
int main()
{
	int X,part2,part3,part167;
	while(cin>>X&&X!=0)
	{
		part2=PowMod29(0,2*X+1);
		part3=PowMod29(1,X+1);
		part167=PowMod29(2,X+1);
		cout<<((part2-1)*(part3-1)*15*(part167-1)*18)%29<<endl;//再模29,因为有超过29的可能.
	}
	return 0;
}

感谢各位的阅读,以上就是“PHP乘法逆元问题怎么解决”的内容了,经过本文的学习后,相信大家对PHP乘法逆元问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联网站建设公司,,小编将为大家推送更多相关知识点的文章,欢迎关注!

当前名称:PHP乘法逆元问题怎么解决-创新互联
转载注明:https://www.cdcxhl.com/article14/ddojge.html

成都网站建设公司_创新互联,为您提供用户体验移动网站建设网站维护定制开发关键词优化网站排名

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设