µÚ16ÕÂ
ÊýÂÛÎÊÌâ
³ÂÓÊýÂÛµÄÄ£°æ
ÔÚȺ¹²ÏíÀïµÄ ×Ô¼ºÕã´óÄ£°æÀïÓÐ
±¾Õ½«ÒªÌÖÂÛÔÚACM³ÌÐòÉè¼Æ¾ºÈüÖгöÏֱȽ϶àµÄÒ»ÀàÎÊÌ⣺ÊýÂÛÎÊÌâ¡£ÓÉÓÚÊýÂÛÎÊÌâÉæ¼°µÄÊýѧ֪ʶ±È½Ï¶à¡¢±È½ÏÉî°Â£¬²»ÄÜÔڶ̶̵ÄÒ»ÕÂÖÐÈ«²¿ÓèÒÔ½éÉÜ£¬Ö»ÄÜͨ¹ý½éÉÜһЩ°¸ÀýÀ´ËµÃ÷³£¼ûµÄÊýÂÛÎÊÌâ¡£
16.1 ÊýµÄÃÝÔËËã
ÓÐÒ»Àà³£¼ûµÄÔËË㣬¾ÍÊÇÇóÐÎÈçamodmµÄÖµ£¬Ò»°ãÇé¿öÏ£¬ÎÒÃÇ¿ÉÒÔÓÃÃݵĶ¨ÒåÀ´×ö£ºÍ¨¹ý³Ë·¨µÄ±¶³ËÀ´ÊµÏÖ£¬ÐèÒª×öb´Î³Ë·¨ºÍÄ£ÔËËã¡£Èç¹ûb±È½Ï´óʱ£¬ÕâÑùµÄ·½·¨¾Í²»ÐÐÁË£¬±¾½Ú½éÉÜÒ»ÖÖÖ»ÐèÒªO(log2b)´Î³Ë·¨ºÍÄ£ÔËËãµÄ·½·¨¡£
ÃݵļÆËã·½·¨
Ê×ÏȽ«Ö¸Êý±ä³É¶þµÄÃݴκ͵ÄÐÎʽ¡£Èç5=1+4=20+22£¬11=1+2+8=20+21+23¡£Èç¹ûb¿ÉÒÔ±íʾΪb?2b0?2b1???2bkµÄÐÎʽ£¬ÄÇôab¿ÉÒÔ±íʾΪ
ba?aib2b0?2b1???2bk?a2b0?2??a2b12bk
±íÃæÉÏ¿´ÕâÑùµÄ±í´ïʽ¸ü¸´ÔÓÁË£¬µ«×¢Òâµ½ÉÏÃæµÄ±í´ïʽµÄ³Ë»ýÏî²»³¬¹ý(log2b)£¬Í¬Ê±£¬ÐÎÈça2£¨i=0,1¡.£©ÓÐÈçϵĵÝÍÆʽ£º
a2ii?1?a2??
i2Ò²¾ÍÊÇ˵£¬ºóÏî¿ÉÒÔͨ¹ýÇ°ÏîµÄƽ·½À´µÃµ½¡£ËùÒÔ¿ÉÒÔÏȽ«ÐÎÈça2£¨i=0,1¡.£©µÄÖµÇó
i³öÀ´£¬¼ÇΪri?a2£¨i=0,1¡.log2b£©,Ôòa?rb?rb???rb£¬²»³¬¹ý(log2b)´Î³Ë·¨¡£
²ÉÓÃÒÔÉϵķ½·¨¼ÆËã³Ë·½µÄʱ¼ä¸´ÔÓ¶ÈΪO(log2b)¡£
12kb16.1.1 ¡¼°¸Àý1¡½¸ß¼¶Ä£ÔËËã 10388 hnu oj
ÈËÓëÈËÊDz»Í¬µÄ,ÓÐЩÈËϲ»¶ÔĶÁÂúÊÇÅ®º¢×ÓµÄÔÓÖ¾£¬ÓÐЩÈËϲ»¶ÔÚµØÏÂÊÒÒý±¬Õ¨µ¯£¬¶ø»¹ÓÐһЩȴϲ»¶Ò»Ð©Âé·³µÄÊý×ÖÓÎÏ·¡£±ÈÈçESSEÂÛ̳µÄÒ»´Î»î¶¯£º
ÿ¸öÈËÑ¡ÔñÁ½¸öÊý×ÖAiºÍBiдÔÚÖ½ÉÏ£¬ÆäËûÈ˲»ÄÜ¿´¼û¡£¹ýÁËÒ»¶Îʱ¼äºó£¬Ã¿¸öÈË˵³ö×Ô¼ºÖ½ÉϵÄÊý×Ö£¬È»ºóÿ¸öÈ˵ÄÄ¿±êÊÇÇó³öËùÓеÄAiBiµÄºÍÄ£MµÄÖµ£¬×îÏÈËã³ö½á¹û
ACM³ÌÐòÉè¼ÆÅàѵ½Ì³Ì
µÄ£¬¾ÍÊÇʤÀûÕß¡£
×÷Ϊһ¸ö³ÌÐòÔ±£¬Ä㵱ȻÓа취±àÒ»¸ö³ÌÐò£¬ÒÔ×î¿ìµÄËÙ¶ÈËã³ö½á¹û£¬Ó®µÃ±ÈÈü¡£
ÊäÈë°üº¬Z×é²âÊÔÊý¾Ý£¬ÊäÈëµÚÒ»ÐÐÖ»°üº¬Êý×ÖZ¡£ËæºóÊDzâÊÔÊý¾Ý£ºµÚÒ»ÐÐÊÇÒ»¸öÊý×ÖM(1¡ÜM¡Ü45000)¡£µÚ¶þÐÐÊÇÊý×ÖH£¨1¡ÜH¡Ü45000£©±íʾ²Î¼ÓÓÎÏ·µÄÈËÊý¡£½ÓÏÂÀ´HÐУ¬Ã¿ÐÐÁ½¸öÊýAiºÍBi£¨1¡ÜAi£¬Bi¡Ü231£©¡£±í´ïʽµÄÖµ£º
(A1B1+A2B2+...+AHBH)mod M.
3
16 4 2 3 3 4 4 5 5 6 36123 1
2374859 3029382 17 1 318132
¶ÔÓÚÿ×é²âÊÔÊý¾Ý£¬Êä³öÒÔÏÂ
ÑùÀýÊä³ö2
13195 13
È¡Ä£ÔËËã¿ÉÒÔÓë¼Ó¡¢¼õ¡¢³Ë¡¢³Ë·½½»»»´ÎÐò£»
(a+b)%m=a%m+b%m a*b%m=(a%m)*(b%m) ab%m=(a%m)b
ËùÒÔ±í´ïʽµÄÈκÎÖмä½á¹û¶¼¿ÉÒÔ½øÐÐÈ¡Ä£ÔËË㣬ʹµÃÖмä½á¹û²»ÖÁÓÚÌ«´ó¶øÒç³ö¡£
±¾ÌâµÄ¹Ø¼üÔÚÓÚ¼ÆËãÐÎÈçab%mµÄ±í´ïʽµÄÖµ£¬ÒòΪbµÄÖµ½Ï´ó£¬²ÉÓÃÁ¬³ËµÄ·½·¨ÊDz»Ðеģ¬²ÉÓñ¾½Ú½éÉܵÄÖ»ÐèÒªO(log2b)´Î³Ë·¨ºÍÄ£ÔËËãµÄ·½·¨¡£
232¡¤ ¡¤
µÚ16ÕÂ ÊýÂÛÎÊÌâ
voidcal(unsigned*r,longunsigneda,unsignedm){ //¼ÆËãaµÄ2j´Î·½¶ÔmÈ¡Ä£µÄ½á¹û,ÓÃÊý×ér±£´æ r[0]=a%m;
for(i=1;i<32;++i)
r[i]=(long)r[i-1]*r[i-1]%m;//ri+1=ri*ri
}
unsignedcalc(unsignedm,longunsigneda,longunsignedb){ //º¯Êý¼ÆËãab%mµÄÖµ
intbl[32],r[32];//blÊÇbµÄ¶þ½øÖƽá¹û£¬r[i]=aµÄ2j´Î·½¶ÔmÈ¡Ä£µÄ½á¹û cal(r,a,m);//¼ÆËãr[i]
while(b){//½«bÓöþ½øÖÆÐÎʽ±íʾ,½á¹û±£´æÔÚblÖÐ
bl[i++]=b%2; b>>=1;}
for(j=0,k=1;j
if(bl[j])//Èç¹û
b¶ÔÓ¦¶þ½øÖÆλbjΪ1,Ôò¶ÔÓ¦µÄrbjÔÚÃݵij˻ý±í´ïʽÖУ¬·ñÔò²»ÔÚ
k=k*r[j]%m;
returnk;}
intmain(){ scanf(\while(z--){
scanf(\ for(j=s=0;j
scanf(\ s=(s+calc(m,a,b))%m;}//¼ÆËã
AjBjµÄÖµ£¬²¢½«ÆäºÍÇó³öÀ´£¬½á¹ûÓñäÁ¿s±£´æ
printf(\
16.2 Å·À¶¨ÀíµÄÓ¦ÓÃ
¶¨Àí(Fermat)1£ºÈç¹ûpÊÇËØÊý£¬Ôò¶ÔÈÎÒâµÄa£¬ÓÐap?1modp?1¡£
¶¨Àí(Euler)2£ºÈç¹ûp²»ÊÇËØÊý£¬Ôò¶ÔÈÎÒâµÄ(a,p)=1£¬ÓÐa?(p)modp?1£¬ÆäÖеÄ
?1??1??1???????(p)?p?1?1??1???????£¬p1,p2,¡,pkÊÇpµÄËùÓÐËØÊýÒò×Ó¡£ ppp1??2?k???16.2.1 ¡¼°¸Àý2¡½¿ìÀÖ2004
¿¼Âǵ½Ò»¸öÕýÕûÊýX£¬SÊÇËùÓÐ2004XµÄÒò×ӵĺͣ¬ÄãµÄÄ¿±êÊÇÇó³öS³ýÒÔ29µÄÓàÊý¡£
¿´¿´X=1µÄÀý×Ó£¬20041µÄËùÓÐÒò×ÓΪ1,2,3,4,6,12,167,334,501,668,1002ºÍ2004£¬Òò
¡¤233¡¤
ACM³ÌÐòÉè¼ÆÅàѵ½Ì³Ì
´ËS=4704£¬¶ø4704 mod 29 =6¡£
ÊäÈëÓжà¸ö²âÊÔÐòÁУ¬Ã¿¸ö²âÊÔÐòÁÐÒ»ÐÐÒ»¸öÕýÕûÊýX£¬(1<=X<=10000000)¡£ X=0±íʾÊäÈë½áÊø£¬²¢ÇÒ²»ÐèÒª´¦Àí¡£
¶Ôÿ¸ö²âÊÔÐòÁУ¬Êä³öÒ»ÐоÍÊÇS³ýÒÔ29µÄÓàÊý¡£
10000 0
10
ÌâÄ¿ÒªÇóµÄÊÇ£¨2004X£©µÄÒò×ӺͶÔ29È¡Ä£µÄ½á¹û Çóij¸öÊýAµÄËùÓÐÒò×Ӻͣ¬Ê×ÏȽ«¸ÃÊý·Ö½â£º
A?p11?p22??pnn£¬ÆäÖÐp1,p2,...,pn¶¼ÊÇËØÊý£¬ÔòAµÄÈÎÒâÒò×Ó¿ÉÒÔ±íʾΪ£º
d?p11?p22??pnn£¬ÆäÖÐ0?i1?r1,....0?in?rn
pnn?1p11?1p22?1???? ½«ÆäÇóºÍ£¬ÎªS?p1?1p2?1pn?1r?1r?1r?1rrriiiÈ磺2004=22*3*167£¬Ôò
23?132?11672?1S????7?4?168?4704
2?13?1167?1¶ø2004X?22X?3X?167X
22X?1?13X?1?1167X?1?1r???ËùÒÔS?£¬ÆäÖÐr?(22X?1?1)(3X?1?1)(167X?1?1) 2?13?1167?1332X»¹ºÜ´ó(1?X?10000000)£¬¸ù¾ÝFermat¶¨Àí,ÈÎÒâËØÊýp,ÈÎÒâÊýa,ÓÐap?1modp?1£¬Ôòa28mod29?1£¬ËùÒÔabmod29?abmod28mod29
ËùÒÔÊ×ÏȽ«X¶Ô28È¡Ä££¬x=X(ÊÇÈ¡Ä£µÄ½á¹û£¬x¾ÍºÜСÁË(0?x<28£¬ÓÐÁËÕâµã£¬ÊäÈëµÄXÔÙ´óҲû¹Øϵ)£¬¼òµ¥¼ÆËã¾Í¿ÉÒԵõ½rµÄÖµ¡£
×îºó£¬¿¼Âǵ½£ºS?rmod29£¬Ò²¼´r?29k?332S£¬kÊÇÂú×ãµÈʽµÄÈÎÒâÕûÊý¡£
332¶ø9?332?103?29?1£¬9?(r?29k)?9?332S?S?103?29S ËùÒÔr?9mod29?Smod29
ÀýÈçµ±X=10000ʱ£¬¼ÆËã200410000=220000*310000*16710000µÄËùÓÐÒò×ӺͶÔ29È¡Ä£µÄ½á¹û
220001?1310001?116710001?1rÆäS? ???2?13?1167?1332 234¡¤ ¡¤