来源:互联网 发布:天狗街源码交易 编辑:程序博客网 时间:2024/05/22 05:33
HDU1452Happy 2004(高次幂取模+积性函数+逆元) 分类: 大数_数论 2013-07-15 15:57 99人阅读 评论(3) 收藏 举报 高次幂取模题目意思:2004^x的所有正因数的和(S)对29求余;输出结果;原题链接题目解析:解析参照来源:点击打开链接因子和6的因子是1,2,3,6; 6的因子和是s(6)=1+2+3+6=12;20的因子是1,2,4,5,10,20; 20的因子和是s(20)=1+2+4+5+10+20=42;2的因子是1,2; 2的因子和是s(2)=1+2=3;3的因子是1,3; 3的因子和是s(3)=1+3=4;4的因子和是 s(4)=1+2+4=7;5的因子和是 s(5)=1+5=6;s(6)=s(2)*s(3)=3*4=12;s(20)=s(4)*s(5)=7*6=42;这是巧合吗?再看 s(50)=1+2+5+10+25+50=93=3*31=s(2)*s(25),s(25)=1+5+25=31.这在数论中叫积性函数,当gcd(a,b)=1时s(a*b)=s(a)*s(b);如果p是素数s(p^n)=1+p+p^2+...+p^n=(p^(n+1)-1) /(p-1) (1)例 hdu1452 Happy2004计算 因子和 s(2004^X) mod 29,2004=2^2 *3 *167s(2004^X) ) = (s(2^2X))) *(s(3^X))) * (s(167^X)))167)=22;s(2004^X) ) = (s(2^2X))) *(s(3^X))) * (s(22^X)))a=s(2^2X)=(2^(2X+1)-1)//根据 (1)b=s(3^X)= (3^(X+1)-1)/2//根据 (1)c=s(22^X)= (22^(X+1)-1)/21//根据 (1)%运算法则 1. (a*b) %p= ( a%p) *(b%p)%运算法则 2. (a/b) %p= ( a *b^(-1)%p)b^(-1)是 b的逆元素 (%p)2的逆元素是15 ()) ,因为2*15=30 % 29=1 % 2921的逆元素是18 ()) ,因为21*18=378% 29 =1 % 29因此a=(powi(2,2*x+1,29)-1)%29;b=(powi(3,x+1,29)-1)*15 %29;c=(powi(22,x+1,29)-1)*18 %29;ans=(a*b)% 29*c % 29;资料拓展: 1. 高次幂快速取模链接 2.积性函数:在数论中的积性函数:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的。若将n表示成质因子分解式则有3.求逆元: 在计算(a/b)%Mod时,往往需要先计算b%Mod的逆元p(b有逆元的条件是gcd(b,Mod)==1,显然素数肯定有逆元),然后由(a*p)%Mod得结果c。这里b的逆元p满足(b*p)%Mod=1。先来简单证明一下:(a/b)%Mod=c; (b*p)%Mod=1; ==》 (a/b)*(b*p) %Mod=c; ==》 (a*p)%Mod=c;从上面可以看出结论的正确性,当然这里b需要是a的因子。接下来就需要知道根据b和Mod,我们怎么计算逆元p了。扩展欧几里德算法,大家应该都知道,就是已知a、b,求一组解(x,y)使得a*x+b*y=1。这里求得的x即为a%b的逆元,y为b%a的逆元(想想为什么?把方程两边都模上b或a看看)。调用ExtGcd(b,Mod,x,y),x即为b%Mod的逆元p。 求b%Mod的逆元p还有另外一种方法,即p=b^(Mod-2)%Mod,因为b^(Mod-1)%Mod=1(这里需要Mod为素数)。错误分析:1:[cpp] view plaincopyprint?if(y&1)ans*=x%29;//误把试中ans=x*x%29 if(y&1)ans*=x%29;//误把试中ans=x*x%292.数据类型要用__int64,代码实现:[cpp] view plaincopyprint?#include #include using namespace std; typedef __int64 ll; ll powmol(ll x,ll y)//高次幂取模的求x^ymod29 { ll ans=1; x=x%29; while(y) { if(y&1)ans*=x%29;//y是奇数情况的处理; x=x*x%29; y>>=1;// } return ans; } int main() { ll x,a,b,c; while(scanf("%I64d",&x),x) { a=(powmol(2,2*x+1)-1)%29; b=(powmol(3,x+1)-1)*15%29; c=(powmol(22,x+1)-1)*18%29; printf("%I64d\n",(a*b)%29*c%29); } return 0; }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 行驶证过期两年怎么办 驾驶证过期7年了怎么办 换驾照过一个月怎么办? 行驶证正本掉了怎么办 车的行驶证丢了怎么办 三星s6 屏幕坏了怎么办 手机摔成黑屏了怎么办 三星屏幕漏液了怎么办 三星s8屏幕漏液怎么办 屏幕紫色漏液了怎么办 华为手机屏碎了怎么办 小米2s按键失灵怎么办 魅蓝屏幕摔花了怎么办 小米手机屏碎了怎么办 厦门医保卡坏了怎么办 医保卡丢了北京怎么办 重庆社保卡丢了怎么办 沈阳医保卡丢了怎么办 小孩医保卡丢了怎么办 少儿医保卡丢了怎么办 孩子医保卡丢了怎么办 医保卡存折丢了怎么办 济宁医保卡丢了怎么办 大连医保卡丢了怎么办 职工医保卡丢了怎么办 太原医保卡丢了怎么办 南京医保卡丢了怎么办 苏州医保卡丢了怎么办 我的医保卡丢了怎么办 医保卡丢了怎么办出院 住院医保卡丢了怎么办 社会医保卡丢了怎么办 医保本丢了,住院怎么办 临时医保卡丢了怎么办 没带医保卡看病怎么办 居民医保卡掉了怎么办 福建医保卡坏了怎么办 大庆医保卡丢了怎么办 坐的士丢了东西怎么办 辞职后不给工资怎么办 小老板不发工资怎么办